我试图做一些超出我的熊猫级别的事情,并且花了太多时间来解决这个问题。在这个例子中,我需要为每个团队返回单独的Dataframe。数据框将显示每个等级的平均成本,平均面积和大小总和。
因为我需要生成单独的表,所以我可能需要将单个团队名称一遍又一遍地传递给函数。为了清楚起见,我很乐意手动将团队名称传递给函数(或类似函数)以生成每个表。
team grade cost area size
0 man utd 1 52300 5 1045
1 chelsea 3 52000 42 957
2 arsenal 2 25000 20 1099
3 man utd 1 61600 20 1400
4 man utd 2 43000 43 1592
5 arsenal 2 23400 78 1006
6 man utd 2 52300 89 987
7 chelsea 4 62000 30 849
8 arsenal 1 62000 46 973
9 arsenal 2 73000 78 1005
man utd数据框看起来像这样:
grade mean_cost mean_area size
1 56590 12.5 2445
2 47650 66 2579
答案 0 :(得分:1)
使用groupby/agg
按team
和grade
分组,汇总cost
,area
和size
列。请注意,agg
可以接受dict
,其键是列名,其值是聚合函数(例如mean
或sum
)。因此,您可以按列指定聚合函数。
In [120]: df.groupby(['team', 'grade']).agg({'cost':'mean', 'area':'mean', 'size':'sum'}).rename(columns={'cost':'mean_cost', 'area':'mean_area'})
Out[120]:
size mean_cost mean_area
team grade
arsenal 1 973 62000.000000 46.000000
2 3110 40466.666667 58.666667
chelsea 3 957 52000.000000 42.000000
4 849 62000.000000 30.000000
man utd 1 2445 56950.000000 12.500000
2 2579 47650.000000 66.000000
groupby
返回一个可迭代的。因此,要将dict映射团队名称映射到DataFrame,您可以使用:
dfs = {team:grp for team, grp in result.reset_index().groupby('team')}
例如,
import pandas as pd
df = pd.DataFrame(
{'area': [5, 42, 20, 20, 43, 78, 89, 30, 46, 78],
'cost': [52300, 52000, 25000, 61600, 43000, 23400, 52300, 62000, 62000, 73000],
'grade': [1, 3, 2, 1, 2, 2, 2, 4, 1, 2], 'size': [1045, 957, 1099, 1400, 1592, 1006, 987, 849, 973, 1005],
'team': ['man utd', 'chelsea', 'arsenal', 'man utd', 'man utd', 'arsenal', 'man utd', 'chelsea', 'arsenal', 'arsenal']})
result = df.groupby(['team', 'grade']).agg({'cost':'mean', 'area':'mean', 'size':'sum'}).rename(columns={'cost':'mean_cost', 'area':'mean_area'})
dfs = {team:grp.drop('team', axis=1)
for team, grp in result.reset_index().groupby('team')}
for team, grp in dfs.items():
print('{}:\n{}\n'.format(team, grp))
产量
chelsea:
grade mean_cost mean_area size
2 3 52000 42 957
3 4 62000 30 849
arsenal:
grade mean_cost mean_area size
0 1 62000.000000 46.000000 973
1 2 40466.666667 58.666667 3110
man utd:
grade mean_cost mean_area size
4 1 56950 12.5 2445
5 2 47650 66.0 2579
请注意,为了获得更好的性能,请尽量避免分手 DataFrames变成较小的DataFrame,因为一旦你使用了dict或list,你就可以了 被迫使用Python循环而不是更快的隐式C编译循环 由Pandas / NumPy方法使用。
因此,对于计算,请尝试坚持使用result
DataFrame。使用dfs
词典
只有当您必须单独打印DataFrames时才会这样做。