我有一个具有 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,但如果我的列用作索引,我不能像这样选择它们。
.reset_index()
reset_index() 是一个 pandas DataFrame 方法,它将索引值作为列传输到 DataFrame 中。该参数的默认设置是 drop=False (这会将索引值保留为列)。
您只需在 DataFrame 名称后调用 .reset_index()
:
df = df.reset_index()
这并不真正适用于您的情况,但可能有助于其他人(如我 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
。
可能存在无法使用 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)
。
正如@cs95 在评论中提到的,要仅删除一个级别,请使用:
df.reset_index(level=[...])
这样可以避免在重置后重新定义所需的索引。
我也遇到了卡尔的问题。我刚刚发现自己重命名聚合列然后重置索引。
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
简短而简单
df2 = pd.DataFrame({'test_col': df['test_col'].describe()})
df2 = df2.reset_index()
不定期副业成功案例分享
df.reset_index(level=[...])
df.reset_index(inplace=True)