ChatGPT解决这个技术问题 Extra ChatGPT

将 Pandas 多索引变成列

我有一个具有 2 个索引级别的数据框:

                         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,但如果我的列用作索引,我不能像这样选择它们。

重复:stackoverflow.com/questions/18624039/… 您想要第一个建议。 .reset_index()
非常感谢,我实际上浏览了很多,但是“使多索引到列”和类似的查询总是让我想要旋转他们的数据框的线程......
当您已经知道答案时,总是更容易找到答案:)

c
cs95

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

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

df = df.reset_index()  

对于我有 3 个索引级别的情况,就地重置不起作用。另一种方法是将新重置的数据帧分配给新的数据帧:df2 = df.reset_index()
要仅重置特定级别,请使用 df.reset_index(level=[...])
或者副作用(可能更快)的方式:df.reset_index(inplace=True)
K
Karl Anka

这并不真正适用于您的情况,但可能有助于其他人(如我 5 分钟前)知道。如果一个人的多重索引具有相同的名称,如下所示:

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

df.reset_index(inplace=True) 将失败,因为创建的列不能具有相同的名称。

因此,您需要使用 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


如何让你的 Trial 价值观重演?我遇到了同样的问题,它可以工作,只是我的价值观不会重复。
A
Alex

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

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

这会将索引值分配给各个列并保留索引。

有关详细信息,请参阅 docs


这太有用了!应该可以使用更清晰的语言来做到这一点,例如df['measurement'] = df.index.values(1)
s
sameagol

正如@cs95 在评论中提到的,要仅删除一个级别,请使用:

df.reset_index(level=[...])

这样可以避免在重置后重新定义所需的索引。


k
kevin_theinfinityfund

我也遇到了卡尔的问题。我刚刚发现自己重命名聚合列然后重置索引。

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

https://i.stack.imgur.com/7mlAz.png

df = df.reset_index()

https://i.stack.imgur.com/DHwDT.png


w
whitetiger1399

简短而简单

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