当我总结一个数据框并将其重新加入原始数据框时,则在使用列名时遇到了麻烦。
这是原始数据框:
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。
资料来源:本增长的出来这前面的问题。
这是因为您的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获取每个组的统计信息(例如计数,均值等)?
| 归档时间: |
|
| 查看次数: |
32 次 |
| 最近记录: |