【问题标题】:Strange column names in dataframe after joining dataframe on summary of itself将数据框加入自身摘要后,数据框中的奇怪列名
【发布时间】:2019-04-17 06:09:58
【问题描述】:

当我汇总一个数据框并将其重新加入原始数据框时,我无法处理列名。

这是原始数据框:

import pandas as pd

d = {'col1': ["a", "a", "b", "a", "b", "a"], 'col2': [0, 4, 3, -5, 3, 4]}
df = pd.DataFrame(data=d)

现在我计算一些统计数据并将摘要合并回:

group_summary = df.groupby('col1', as_index = False).agg({'col2': ['mean', 'count']})
df = pd.merge(df, group_summary, on = 'col1')

数据框现在有一些奇怪的列名:

df
Out: 
  col1  col2  (col2, mean)  (col2, count)
0    a     0          0.75              4
1    a     4          0.75              4
2    a    -5          0.75              4
3    a     4          0.75              4
4    b     3          3.00              2
5    b     3          3.00              2

我知道我可以使用df.iloc[:, 2] 之类的列,但我也想使用df['(col2, mean)'] 之类的列,但这会返回KeyError

来源:这源于this 上一个问题。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    这是因为您的GroupBy.agg 操作会生成 MultiIndex 数据帧,并且当将单级标头 DataFrame 与 MultiIndexed 合并时,multiIndex 会转换为平面元组。

    按如下方式修复您的 groupby 代码:

    group_summary = df.groupby('col1', as_index=False)['col2'].agg(['mean', 'count'])
    

    Merge 现在提供扁平列。

    df.merge(group_summary, on='col1')
    
      col1  col2  mean  count
    0    a     0  0.75      4
    1    a     4  0.75      4
    2    a    -5  0.75      4
    3    a     4  0.75      4
    4    b     3  3.00      2
    5    b     3  3.00      2
    

    更好的是,使用transform 将输出映射到输入维度。

    g = df.groupby('col1', as_index=False)['col2']
    df.assign(mean=g.transform('mean'), count=g.transform('count'))
    
      col1  col2  mean  count
    0    a     0  0.75      4
    1    a     4  0.75      4
    2    b     3  3.00      2
    3    a    -5  0.75      4
    4    b     3  3.00      2
    5    a     4  0.75      4
    

    专业提示,您可以使用describe 在单个函数调用中计算一些有用的统计信息。

    df.groupby('col1').describe()
    
          col2                                          
         count  mean       std  min   25%  50%  75%  max
    col1                                                
    a      4.0  0.75  4.272002 -5.0 -1.25  2.0  4.0  4.0
    b      2.0  3.00  0.000000  3.0  3.00  3.0  3.0  3.0
    

    另见Get statistics for each group (such as count, mean, etc) using pandas GroupBy?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-11
      • 1970-01-01
      • 1970-01-01
      • 2019-02-09
      • 2022-09-23
      • 1970-01-01
      相关资源
      最近更新 更多