在Pandas Multiindex上相交

时间:2017-08-22 09:53:44

标签: python pandas

我想切片Multiindex Dataframe。让我们以此df为例:

import pandas as pd

arrays = [['bar', 'bar', 'bar','bar', 'foo','foo', 'qux', 'qux', 
'qux','qux', 'qux'],
      ['2', '3', '4','10', '3','10','2','3','6','10','11']]
df = pd.DataFrame(np.random.randn(11, 4), index=arrays).sort_index()

- >

               0         1         2         3
bar 10  1.411962 -0.742729  0.950159  1.074269
    2   1.214804 -0.654806 -1.138855  0.609101
    3   0.135363  1.226927 -0.501535 -0.791849
    4   1.118516 -1.340844 -1.365790 -0.099575
foo 10 -0.004108 -0.067574 -0.139101 -0.358282
    3   0.612849 -0.598579  0.923299 -0.218198
qux 10  0.112769 -1.330163  2.195480 -0.347462
    11  0.057467 -0.204044  0.020474 -1.198299
    2   1.011604 -0.411514  0.941112 -0.509703
    3   0.524958 -0.855275  0.257481  0.630311
    6   1.989778 -0.099014  0.302340 -0.067559

现在我想得到第二个索引有一些值的行。所以我想说我只想要第二个索引包含' 2' AND' 3'和' 10',所以我可以这样做:

sliced = df.loc[(slice(None), ['2','3','10']), :]

产生:

               0         1         2         3
bar 10  1.411962 -0.742729  0.950159  1.074269
    2   1.214804 -0.654806 -1.138855  0.609101
    3   0.135363  1.226927 -0.501535 -0.791849
foo 10 -0.004108 -0.067574 -0.139101 -0.358282
    3   0.612849 -0.598579  0.923299 -0.218198
qux 10  0.112769 -1.330163  2.195480 -0.347462
    2   1.011604 -0.411514  0.941112 -0.509703
    3   0.524958 -0.855275  0.257481  0.630311

但我不希望这行包含[' 10',' 3']。所以期望的结果将是:

               0         1         2         3
bar 10  1.411962 -0.742729  0.950159  1.074269
    2   1.214804 -0.654806 -1.138855  0.609101
    3   0.135363  1.226927 -0.501535 -0.791849
qux 10  0.112769 -1.330163  2.195480 -0.347462
    2   1.011604 -0.411514  0.941112 -0.509703
    3   0.524958 -0.855275  0.257481  0.630311

我试过但我无法理解如何妥善解决这个问题。任何帮助是极大的赞赏。

1 个答案:

答案 0 :(得分:0)

正如COLDSPEED所说,似乎不可能抛出纯粹的索引。 但是,您可以通过groupby语句在几个步骤中完成此操作。 如果我们再次使用您的代码

>>> mask = sliced.groupby(level=0)[0].count() == len(col_list)
>>> sliced[mask[sliced.index.get_level_values(0)].values]

               0         1         2         3
bar 10  0.026192 -1.367292 -1.732297 -0.174405
    2  -0.351960  0.563901  0.634585 -0.540770
    3   0.489480  0.265043  0.989557  0.783377
qux 10  0.544202 -0.061462  1.020261 -2.170451
    2  -0.506330  0.335722 -0.303334 -0.916619
    3   0.877082  0.235224  0.868546  2.197707

然后我们可以应用groupby来查找每个第一级索引的项目数。然后我们将它与您期望的项目数进行比较。最后,我们使用创建的布尔掩码来过滤我们的数据帧(有关here的更多详细信息)。

npm link