【问题标题】:How can multiple columns from different levels be selected?如何选择不同级别的多个列?
【发布时间】:2017-08-12 17:25:47
【问题描述】:

下面的数据框是一个带有分层列 (df) 的多索引数据框:

 EMG 生物反馈
时间标识
                   delta theta alpha beta 高 beta gamma HeartRateVariabilty GSR
20170101 PD102 4 5 8 3 0 9 1 2
20170102 PD102 5 7 8 4 6 5 2 3

如何选择不同级别的多个列?例如,我怎样才能获得显示所有 EMG 列 和仅 Biofeedback 列 下的 GSR 列 的数据框(如下所示)

 EMG 生物反馈
时间标识
                   delta theta alpha beta 高 beta gamma GSR
20170101 PD102 4 5 8 3 0 9 2
20170102 PD102 5 7 8 4 6 5 3 

【问题讨论】:

  • 你有生成这个数据框的代码吗?

标签: python pandas select multiple-columns hierarchical-data


【解决方案1】:

这里有几种访问/子选择分层列的方法

1.使用第一级的get_level_values并拒绝HeartRateVariabilty

In [764]: df.loc[:, df.columns.get_level_values(1) != 'HeartRateVariabilty']
Out[764]:
                 EMG                                  Biofeedback
               delta theta alpha beta high beta gamma         GSR
Time     ID
20170101 PD102     4     5     8    3         0     9           2
20170102 PD102     5     7     8    4         6     5           3

2. 或者,在第一级使用select 并拒绝HeartRateVariabilty

In [765]: df.select(lambda x: x[1] != 'HeartRateVariabilty', axis=1)
Out[765]:
                 EMG                                  Biofeedback
               delta theta alpha beta high beta gamma         GSR
Time     ID
20170101 PD102     4     5     8    3         0     9           2
20170102 PD102     5     7     8    4         6     5           3

3. 或者,在第一级使用drop 并拒绝HeartRateVariabilty

In [766]: df.drop('HeartRateVariabilty', axis=1, level=1)
Out[766]:
                 EMG                                  Biofeedback
               delta theta alpha beta high beta gamma         GSR
Time     ID
20170101 PD102     4     5     8    3         0     9           2
20170102 PD102     5     7     8    4         6     5           3

4. 或者,使用.loc 子选择列对元组的列表

In [777]: cols = [('EMG', 'delta'), ('EMG', 'theta'), ('EMG', 'alpha'), ('EMG', 'beta'),
                  ('EMG', 'high beta'), ('EMG', 'gamma'), ('Biofeedback', 'GSR')]
In [778]: df.loc[:, cols]
Out[778]:
                 EMG                                  Biofeedback
               delta theta alpha beta high beta gamma         GSR
Time     ID
20170101 PD102     4     5     8    3         0     9           2
20170102 PD102     5     7     8    4         6     5           3

【讨论】:

  • 谢谢!解决方案 4 对我来说效果最好,因为我需要在 Biofeedback 下的多个列,即 GSR 和另一个(不是示例!)。仅供参考,是否可以使用解决方案 1、2、3 删除或拒绝多个列?
  • 是的,作为一个列表,并且在需要的地方具有x not in [..] 条件。
猜你喜欢
  • 1970-01-01
  • 2021-03-24
  • 1970-01-01
  • 1970-01-01
  • 2023-01-23
  • 1970-01-01
  • 1970-01-01
  • 2011-04-24
  • 2015-10-29
相关资源
最近更新 更多