如何在 pandas DataFrame 中恢复\展开多索引
Posted
技术标签:
【中文标题】如何在 pandas DataFrame 中恢复\\展开多索引【英文标题】:How to restore\unfold multiindex in pandas DataFrame如何在 pandas DataFrame 中恢复\展开多索引 【发布时间】:2013-08-14 04:28:11 【问题描述】:我快要发疯了。我有一个这样的数据框:
subject sessionIndex screenIndex index key time
s019 1 3 1 Shift 0.3442
s019 1 3 2 Shift.t 0.1514
s019 1 3 3 h 0.0844
s019 1 3 4 e 0.1127
s019 1 3 5 space 0.1201
s091 3 5 821 h 0.1126
s091 3 5 822 a 0.1425
s091 3 5 823 n 0.0926
s091 3 5 824 d 0.1525
使用后:
pivot_table(data,values='time', rows=['subject','sessionIndex','screenIndex','index'], cols=['key'])
我有以下数据框:
key Shift Shift.t a d ...
subject sessionIndex screenIndex index
s019 1 3 1 0.3442 NaN NaN NaN ...
2 NaN 0.1514 NaN NaN ...
3 NaN NaN NaN NaN ...
4 NaN NaN NaN NaN ...
5 NaN NaN NaN NaN ...
s091 3 5 821 NaN NaN NaN NaN ...
822 NaN NaN 0.1425 NaN ...
823 NaN NaN NaN NaN ...
824 NaN NaN NaN 0.1525 ...
这很好,但我坚持“展开”多索引,以便我的数据框看起来像这样:
subject sessionIndex screenIndex index Shift Shift.t a d ...
s019 1 3 1 0.3442 NaN NaN NaN ...
s019 1 3 2 NaN 0.1514 NaN NaN ...
s019 1 3 3 NaN NaN NaN NaN ...
s019 1 3 4 NaN NaN NaN NaN ...
s019 1 3 5 NaN NaN NaN NaN ...
s091 3 5 821 NaN NaN NaN NaN ...
s091 3 5 822 NaN NaN 0.1425 NaN ...
s091 3 5 823 NaN NaN NaN NaN ...
s091 3 5 824 NaN NaN NaN 0.1525 ...
我已经尝试过重新索引和索引重置。我对 pandas 和 python 还很陌生,所以也许我只是愚蠢。请让我知道我在这里缺少什么,谢谢。
【问题讨论】:
我不确定您所说的“展开”是什么意思。尽管为了显示目的而隐藏了重复索引,但它们仍然存在。但也许您希望四个 MultiIndex 级别是普通列——在这种情况下,它们将按您指定的方式显示,并且在某些方面更容易处理。在这种情况下,只需使用df.reset_index()
的结果即可。
嗨,丹,谢谢您的回复。我已经试过了。问题是此命令还将所有变量恢复为案例。所以我的数据和我之前调用的pivot_table一样。
嗯。这很令人惊讶。你确定你是在pivot_table的结果上执行reset_index,而不是在原来的DataFrame上?
我快疯了。看来你是对的。我添加了一个临时变量来存储 pivot_table 的结果,现在它似乎可以工作了! Big THX 永远不会独自解决这个问题!
【参考方案1】:
这只是 pandas 中的一个显示选项。
尝试在导入 pandas 后立即添加此行:
pandas.set_printoptions(multi_sparse=False)
【讨论】:
嗨,保罗,谢谢您的回复。我的问题实际上不是格式。我想使用这些列来执行一些选择器。当列连接到多索引中时,这要困难得多。因此我想恢复索引列。 @user2675976 最好保留索引,IMO。dataframe.select
方法可以非常强大地对 MultiIndex
的乘法值执行选择(例如,subset = df.select(lambda x: x[0] == 'S019' and s[2] in [3,5] and s[3] <= 5)
谢谢保罗。我解决了我的问题。因为我想在之后使用不同的选择标准: train = data[data['subject']==user] train = train[train['sessionIndex']==1] 似乎更容易恢复 inices。以上是关于如何在 pandas DataFrame 中恢复\展开多索引的主要内容,如果未能解决你的问题,请参考以下文章
Pandas:如何将 cProfile 输出存储在 pandas DataFrame 中?
如何在 pandas.DataFrame 中插入满足条件的行值