我有一个带有"组"的数据框。变量,"计数"变量和"总数"变量。对于每个组,我想对计数列求和,并将其除以总列的总和。我如何做到这一点,理想情况下是在一行代码中?
以下是一个使用的示例:
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()
方法。
答案 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