使用groupby时,如何使用pandas中的一个函数聚合多个列?

时间:2017-03-20 03:03:00

标签: python pandas aggregate

我有一个带有"组"的数据框。变量,"计数"变量和"总数"变量。对于每个组,我想对计数列求和,并将其除以总列的总和。我如何做到这一点,理想情况下是在一行代码中?

以下是一个使用的示例:

test_dc = {1:{'group':'A','cnt':3,'total':5},
           2:{'group':'B','cnt':1,'total':8},
           3:{'group':'A','cnt':2,'total':4},
           4:{'group':'B','cnt':6,'total':13}
          }
test_df = pd.DataFrame.from_dict(test_dc, orient='index')

预期产出(大致):

group | average
    A | 0.55555
    B | 0.33333

编辑:更改了"计数"的列名到" cnt"因为在groupby对象上似乎有一个现有的count()方法。

2 个答案:

答案 0 :(得分:4)

您可以使用DataFrame.groupby按列进行分组,然后在其上调用sum以获取总和。

>>> df = test_df
    .groupby('group')
    .sum()
>>> df      
       count  total
group              
A          5      9
B          7     21

然后你可以抓住专栏并将它们分开来得到答案。

>>> df['count'] / df['total']
    group
A    0.555556
B    0.333333
dtype: float64

您可以利用DataFrame.pipe运算符在一行中执行此操作:

test_df
    .groupby('group')
    .sum()
    .pipe(lambda df: df['count'] / df['total'])

答案 1 :(得分:1)

我会使用SELECT a.id,a.loc,t.vals FROM table1 a, unnest(ARRAY[a.val1,a.val2,a.val3,a.val4]) t(vals); CREATE OR REPLACE FUNCTION columns_to_rows( out id integer, out loc text, out vals integer ) RETURNS SETOF record AS $body$ DECLARE columns_to_rows text; BEGIN SELECT string_agg('a.'||attname, ',') into columns_to_rows FROM pg_attribute WHERE attrelid = 'your_table'::regclass AND --table name attnum > 0 and --get just the visible columns attname <> all (array [ 'id', 'loc' ]) AND --exclude some columns NOT attisdropped ; --column is not dropped RETURN QUERY EXECUTE format('SELECT a.id,a.loc,t.vals FROM your_table a, unnest(ARRAY[%s]) t(vals)',columns_to_rows); end; $body$ LANGUAGE 'plpgsql'

的组合
agg