Pandas:返回一个具有多个聚合值的Dataframe,这些值取决于另一个值

时间:2016-04-18 20:58:41

标签: python pandas

我试图做一些超出我的熊猫级别的事情,并且花了太多时间来解决这个问题。在这个例子中,我需要为每个团队返回单独的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

1 个答案:

答案 0 :(得分:1)

使用groupby/aggteamgrade分组,汇总costareasize列。请注意,agg可以接受dict,其键是列名,其值是聚合函数(例如meansum)。因此,您可以按列指定聚合函数。

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时才会这样做。