如何在 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 中遍历 DataFrame 中的行

如何在 Pandas 中遍历 DataFrame 中的行

Pandas:如何将 cProfile 输出存储在 pandas DataFrame 中?

如何在 pandas.DataFrame 中插入满足条件的行值

python: pandas.DataFrame,如何避免keyerror?

如何在 jupyter 中像 pandas Dataframe 一样打印 Pyspark Dataframe