【问题标题】:pandas dataframe select columns in multiindex [duplicate]熊猫数据框选择多索引中的列[重复]
【发布时间】:2014-10-01 02:40:40
【问题描述】:

我有以下 pd.DataFrame:

Name    0                       1                      ...
Col     A           B           A            B         ...
0       0.409511    -0.537108   -0.355529    0.212134  ...
1       -0.332276   -1.087013    0.083684    0.529002  ...
2       1.138159    -0.327212    0.570834    2.337718  ...

它具有带有names=['Name', 'Col'] 和分层级别的MultiIndex 列。 Name 标签从 0 到 n,对于每个标签,有两个 AB 列。

我想子选此 DataFrame 的所有 A(或 B)列。

【问题讨论】:

标签: python pandas hierarchical multi-index


【解决方案1】:

有一个get_level_values 方法可以与布尔索引结合使用以获得预期结果。

In [13]:

df = pd.DataFrame(np.random.random((4,4)))
df.columns = pd.MultiIndex.from_product([[1,2],['A','B']])
print df
          1                   2          
          A         B         A         B
0  0.543980  0.628078  0.756941  0.698824
1  0.633005  0.089604  0.198510  0.783556
2  0.662391  0.541182  0.544060  0.059381
3  0.841242  0.634603  0.815334  0.848120
In [14]:

print df.iloc[:, df.columns.get_level_values(1)=='A']
          1         2
          A         A
0  0.543980  0.756941
1  0.633005  0.198510
2  0.662391  0.544060
3  0.841242  0.815334

【讨论】:

  • 请注意,按名称引用索引级别 df.columns.get_level_values("Col") 似乎也可以工作,至少在 Pandas 1.1.5 上是这样。
【解决方案2】:

方法一:

df.xs('A', level='Col', axis=1)

更多信息请参考http://pandas.pydata.org/pandas-docs/stable/advanced.html#cross-section

方法二:

df.loc[:, (slice(None), 'A')]

警告:此方法需要对标签进行排序。更多请参考http://pandas.pydata.org/pandas-docs/stable/advanced.html#the-need-for-sortedness-with-multiindex

【讨论】:

  • 有没有办法将.xs() 方法与多个列一起使用,例如列A B
  • 这些解决方案似乎都过于复杂,应该有更直观的方法来做到这一点。
  • 注意:xs 不能用于设置值。为此必须使用切片。
  • @darXider 根据文档字符串,df.xs( ('A', 'B'), ...) 应该可以工作。
【解决方案3】:

编辑* 现在最好的方法是使用 indexSlice 进行多索引选择

idx = pd.IndexSlice
A = df.loc[:,idx[:,'A']]
B = df.loc[:,idx[:,'B']]

【讨论】:

  • 为我工作,谢谢。
猜你喜欢
  • 2021-10-14
  • 1970-01-01
  • 2018-11-26
  • 2018-05-28
  • 2020-01-12
  • 2017-10-30
  • 2020-03-24
  • 2018-06-19
  • 2017-03-12
相关资源
最近更新 更多