如何展平列中的层次索引

新手上路,请多包涵

我在轴 1(列)中有一个带有层次索引的数据框(来自 groupby.agg 操作):

      USAF   WBAN  year  month  day  s_PC  s_CL  s_CD  s_CNT  tempf
                                     sum   sum   sum    sum   amax   amin
0  702730  26451  1993      1    1     1     0    12     13  30.92  24.98
1  702730  26451  1993      1    2     0     0    13     13  32.00  24.98
2  702730  26451  1993      1    3     1    10     2     13  23.00   6.98
3  702730  26451  1993      1    4     1     0    12     13  10.04   3.92
4  702730  26451  1993      1    5     3     0    10     13  19.94  10.94

我想将其展平,使其看起来像这样(名称并不重要 - 我可以重命名):

      USAF   WBAN  year  month  day  s_PC  s_CL  s_CD  s_CNT  tempf_amax  tmpf_amin
0  702730  26451  1993      1    1     1     0    12     13  30.92          24.98
1  702730  26451  1993      1    2     0     0    13     13  32.00          24.98
2  702730  26451  1993      1    3     1    10     2     13  23.00          6.98
3  702730  26451  1993      1    4     1     0    12     13  10.04          3.92
4  702730  26451  1993      1    5     3     0    10     13  19.94          10.94

我该怎么做呢? (我尝试了很多,但无济于事。)

根据建议,这里是 dict 形式的头部

{('USAF', ''): {0: '702730',
  1: '702730',
  2: '702730',
  3: '702730',
  4: '702730'},
 ('WBAN', ''): {0: '26451', 1: '26451', 2: '26451', 3: '26451', 4: '26451'},
 ('day', ''): {0: 1, 1: 2, 2: 3, 3: 4, 4: 5},
 ('month', ''): {0: 1, 1: 1, 2: 1, 3: 1, 4: 1},
 ('s_CD', 'sum'): {0: 12.0, 1: 13.0, 2: 2.0, 3: 12.0, 4: 10.0},
 ('s_CL', 'sum'): {0: 0.0, 1: 0.0, 2: 10.0, 3: 0.0, 4: 0.0},
 ('s_CNT', 'sum'): {0: 13.0, 1: 13.0, 2: 13.0, 3: 13.0, 4: 13.0},
 ('s_PC', 'sum'): {0: 1.0, 1: 0.0, 2: 1.0, 3: 1.0, 4: 3.0},
 ('tempf', 'amax'): {0: 30.920000000000002,
  1: 32.0,
  2: 23.0,
  3: 10.039999999999999,
  4: 19.939999999999998},
 ('tempf', 'amin'): {0: 24.98,
  1: 24.98,
  2: 6.9799999999999969,
  3: 3.9199999999999982,
  4: 10.940000000000001},
 ('year', ''): {0: 1993, 1: 1993, 2: 1993, 3: 1993, 4: 1993}}

原文由 Ross R 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 863
2 个回答

我认为最简单的方法是将列设置为顶层:

 df.columns = df.columns.get_level_values(0)

注意:如果 to 级别有名称,您也可以通过 this 访问它,而不是 0。

.

如果您想将/ join 您的 MultiIndex 合并为一个索引 (假设您的列中只有字符串条目), 您可以:

 df.columns = [' '.join(col).strip() for col in df.columns.values]

注意:我们必须 strip 没有第二个索引时的空格。

 In [11]: [' '.join(col).strip() for col in df.columns.values]
Out[11]:
['USAF',
 'WBAN',
 'day',
 'month',
 's_CD sum',
 's_CL sum',
 's_CNT sum',
 's_PC sum',
 'tempf amax',
 'tempf amin',
 'year']

原文由 Andy Hayden 发布,翻译遵循 CC BY-SA 3.0 许可协议

该线程上的所有当前答案肯定都有些过时了。从 pandas 版本 0.24.0 开始, .to_flat_index() 您的需求。

来自熊猫 自己的文档

MultiIndex.to_flat_index()

将 MultiIndex 转换为包含级别值的元组索引。

其文档中的一个简单示例:

 import pandas as pd
print(pd.__version__) # '0.23.4'
index = pd.MultiIndex.from_product(
        [['foo', 'bar'], ['baz', 'qux']],
        names=['a', 'b'])

print(index)
# MultiIndex(levels=[['bar', 'foo'], ['baz', 'qux']],
#           codes=[[1, 1, 0, 0], [0, 1, 0, 1]],
#           names=['a', 'b'])

申请 to_flat_index()

 index.to_flat_index()
# Index([('foo', 'baz'), ('foo', 'qux'), ('bar', 'baz'), ('bar', 'qux')], dtype='object')


用它来替换现有的 pandas

如何在 dat 上使用它的示例,这是一个带有 MultiIndex 列的 DataFrame:

 dat = df.loc[:,['name','workshop_period','class_size']].groupby(['name','workshop_period']).describe()
print(dat.columns)
# MultiIndex(levels=[['class_size'], ['count', 'mean', 'std', 'min', '25%', '50%', '75%', 'max']],
#            codes=[[0, 0, 0, 0, 0, 0, 0, 0], [0, 1, 2, 3, 4, 5, 6, 7]])

dat.columns = dat.columns.to_flat_index()
print(dat.columns)
# Index([('class_size', 'count'),  ('class_size', 'mean'),
#     ('class_size', 'std'),   ('class_size', 'min'),
#     ('class_size', '25%'),   ('class_size', '50%'),
#     ('class_size', '75%'),   ('class_size', 'max')],
#  dtype='object')


就地展平和重命名

可能值得注意的是如何将它与简单的列表理解结合起来(感谢@Skippy 和@mmann1123)来连接元素,这样你得到的列名就是简单的字符串,例如,用下划线分隔:

 dat.columns = ["_".join(a) for a in dat.columns.to_flat_index()]

原文由 onlyphantom 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题