在自身汇总后加入数据框后,数据框中的列名称奇怪

uli*_*a2_ 2 python pandas

当我总结一个数据框并将其重新加入原始数据框时,则在使用列名时遇到了麻烦。

这是原始数据框:

import pandas as pd

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

现在,我计算一些统计数据并将其合并回:

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

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

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
Run Code Online (Sandbox Code Playgroud)

我知道我可以像使用列df.iloc[:, 2],但是我也想像使用它们df['(col2, mean)'],但这会返回a KeyError

资料来源:本增长的出来前面的问题。

cs9*_*s95 5

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

修正您的groupby代码,如下所示:

group_summary = df.groupby('col1', as_index=False)['col2'].agg(['mean', 'count'])
Run Code Online (Sandbox Code Playgroud)

合并现在会给出扁平列。

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
Run Code Online (Sandbox Code Playgroud)

更好的是,用于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
Run Code Online (Sandbox Code Playgroud)

专业提示,您可以用来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
Run Code Online (Sandbox Code Playgroud)

另请参阅使用pandas GroupBy获取每个组的统计信息(例如计数,均值等)?