将Pandas多索引转换为列

wvyml7n5  于 2022-10-30  发布在  Python
关注(0)|答案(7)|浏览(257)

我有一个具有2个索引级别的 Dataframe :

value
Trial    measurement
    1              0        13
                   1         3
                   2         4
    2              0       NaN
                   1        12
    3              0        34

我想把它变成这样:

Trial    measurement       value

    1              0        13
    1              1         3
    1              2         4
    2              0       NaN
    2              1        12
    3              0        34

我如何才能最好地做到这一点?
我之所以需要这样做,是因为我想聚合数据as instructed here,但是如果我的列用作索引,我就不能这样选择它们。

sxpgvts3

sxpgvts31#

  • reset_index()* 是一个PandasDataFrame方法,它会将索引值作为列传输到DataFrame中。该参数的默认设置是 drop=False(它会将索引值作为列保留)。

您只需在DataFrame的名称之后调用.reset_index()

df = df.reset_index()
xmjla07d

xmjla07d2#

这并不适用于你的情况,但对其他人(比如5分钟前的我)来说可能会有帮助。如果一个人的multindex具有相同的名称,如:

value
Trial        Trial
    1              0        13
                   1         3
                   2         4
    2              0       NaN
                   1        12
    3              0        34

df.reset_index(inplace=True)将失败,因为创建的列不能具有相同的名称。
因此,您需要将multindex重命名为df.index = df.index.set_names(['Trial', 'measurement']),以获得:

value
Trial    measurement       

    1              0        13
    1              1         3
    1              2         4
    2              0       NaN
    2              1        12
    3              0        34

然后df.reset_index(inplace=True)就会像一个魅力一样工作。
我在一个名为live_date的日期时间列(不是索引)上按年和月分组后遇到了这个问题,这意味着年和月都被命名为live_date

vxqlmq5t

vxqlmq5t3#

在某些情况下,df.reset_index()可能无法使用(例如,当您也需要索引时)。在这种情况下,请使用index.get_level_values()直接访问索引值:

df['Trial'] = df.index.get_level_values(0)
df['measurement'] = df.index.get_level_values(1)

这会将索引值指派给个别数据行保留索引。
有关详细信息,请参阅docs

smtd7mpg

smtd7mpg4#

正如@cs95在注解中提到的,要只删除一个级别,请用途:
df.reset_index(level=[...])
这样可以避免在重置后重新定义所需的索引。

e5nqia27

e5nqia275#

我也遇到了Karl的问题,我只是发现自己重命名了聚合列,然后重新设置了索引。

df = pd.DataFrame(df.groupby(['arms', 'success'])['success'].sum()).rename(columns={'success':'sum'})

df = df.reset_index()

fjaof16o

fjaof16o6#

简短而简单

df2 = pd.DataFrame({'test_col': df['test_col'].describe()})
df2 = df2.reset_index()
y4ekin9u

y4ekin9u7#

类似于Alex solution,但形式更为一般化。它保持索引不变,并将索引级别作为新列添加到其名称中。

for i in df.index.names:
    df[i] = df.index.get_level_values(i)

其给出了

value Trial    measurement
Trial measurement             
    1           0     13     1              0     
                1      3     1              1     
                2      4     1              2     
  ...

相关问题