【问题标题】:Pandas Dataframe, how to group columns together in PythonPandas Dataframe,如何在 Python 中将列组合在一起
【发布时间】:2018-12-10 21:50:45
【问题描述】:

我有一个 pandas 数据框,我想对一些列进行分组以构建更高级别的列:

例子:我有

Index       A       B       C       D
    1    0.25     0.3    0.25    0.66
    2    0.25     0.3    0.25    0.66
    3    0.25     0.3    0.25    0.66

我想要

    Index              AB        ||           CD
    Subindex       A   |      B  ||      C    |      D 
    1            0.25  |    0.3  ||   0.25    |    0.66
    2            0.25  |    0.3  ||   0.25    |    0.66
    3            0.25  |    0.3  ||   0.25    |    0.66

感谢您的帮助...

【问题讨论】:

  • "我有","我想要"...而你试过了吗?
  • 检查多个索引

标签: python pandas dataframe group-by


【解决方案1】:

创建一个字典来定义您的映射并使用pd.MultiIndex.from_tuples。如果需要,您还可以指定names=['level_0', 'level_1'] 来添加名称。

import pandas as pd

d = {'A': 'AB', 'B': 'AB', 'C': 'CD', 'D': 'CD'}
df.columns = pd.MultiIndex.from_tuples([*zip(map(d.get, df), df)])
# Equivalently
# df.columns = pd.MultiIndex.from_tuples([(d[col], col) for col in df.columns])

输出:

         AB         CD      
          A    B     C     D
Index                       
1      0.25  0.3  0.25  0.66
2      0.25  0.3  0.25  0.66
3      0.25  0.3  0.25  0.66

【讨论】:

  • 嗨,谢谢你的回答,但我已经按照你说的做了一个双循环来填充一个新的数据框,看起来这不是最快的选择。有没有可能的方法来进行更改?
  • @Tbertin 您的问题/评论没有多大意义。这个答案确实改变了数据框,并且应该很快,因为它只是改变了列对象。
  • @ALollz pd.MultiIndex.from_tuples([*zip(map(d.get, df), df)]) 作为一个有趣的选择。当然,您的更具可读性(-:
  • 谢谢:D。肯定需要尽快将该语法提交到内存中。
【解决方案2】:

groupby / concat 黑客

m = {'A': 'AB', 'B': 'AB', 'C': 'CD', 'D': 'CD'}
pd.concat(dict((*df.groupby(m, 1),)), axis=1)

         AB         CD      
          A    B     C     D
Index                       
1      0.25  0.3  0.25  0.66
2      0.25  0.3  0.25  0.66
3      0.25  0.3  0.25  0.66

请注意,使用此方法可以选择原始 DataFrame 中列的任意子集,而替代答案似乎需要父 DataFrame 中所有值的有效字典映射

【讨论】:

  • 很抱歉,但是您现在如何将 AB 和 CD 分组到更高级别?最后我想有 DataFrame ['ABCD'] ['AB] ['A'] 例如。同样的逻辑似乎不起作用......
  • 如果我有一个我不想分组的列“F”怎么办?
  • pd.concat(dict((*df.drop(cols2skip, axis=1).groupby(m, 1),)), axis=1) 其中cols2skip 是不包括的列列表。如果只有一列pd.concat(dict((*df.drop('F', axis=1).groupby(m, 1),)), axis=1)
猜你喜欢
  • 2021-07-11
  • 2012-06-13
  • 1970-01-01
  • 2015-02-15
  • 2014-02-08
  • 2015-01-24
  • 2021-10-24
  • 2014-01-08
  • 1970-01-01
相关资源
最近更新 更多