将 Pandas 多索引变成列
Posted
技术标签:
【中文标题】将 Pandas 多索引变成列【英文标题】:Turn Pandas Multi-Index into column 【发布时间】:2018-10-12 17:42:53 【问题描述】:我有一个具有 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,但如果我的列用作索引,我就无法选择这样的列。
【问题讨论】:
重复:***.com/questions/18624039/… 你想要第一个建议。.reset_index()
非常感谢,我实际上浏览了很多,但是“使多索引到列”和类似的查询总是让我想转动他们的数据框......
当你已经知道答案时总是更容易找到答案:)
【参考方案1】:
reset_index() 是一个 pandas DataFrame 方法,它将索引值作为列传输到 DataFrame 中。该参数的默认设置是 drop=False(将索引值保留为列)。
您只需在 DataFrame 名称后调用 .reset_index()
:
df = df.reset_index()
【讨论】:
对于我有 3 个索引级别的情况,就地重置不起作用。另一种方法是将新重置的数据帧分配给新的数据帧:df2 = df.reset_index() 要仅重置特定级别,请使用df.reset_index(level=[...])
【参考方案2】:
这并不真正适用于您的情况,但可能有助于其他人(例如 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 价值观重演?我遇到了同样的问题,但我的价值观不会重复。【参考方案3】:正如@cs95 在评论中提到的,要只下降一个级别,请使用:
df.reset_index(level=[...])
这样可以避免在重置后重新定义所需的索引。
【讨论】:
【参考方案4】:可能存在无法使用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)
.【参考方案5】:
我也遇到了 Karl 的问题。我刚刚发现自己重命名了聚合列,然后重置了索引。
df = pd.DataFrame(df.groupby(['arms', 'success'])['success'].sum()).rename(columns='success':'sum')
df = df.reset_index()
【讨论】:
以上是关于将 Pandas 多索引变成列的主要内容,如果未能解决你的问题,请参考以下文章