如果我有以下df:
amount name role desc
0 1.0 a x f
1 2.0 a y g
2 3.0 b y h
3 4.0 b y j
4 5.0 c x k
5 6.0 c x l
6 6.0 c y p
我想按name
和role
列进行分组,将amount
加起来,还要将desc
与,
串联在一起:
amount name role desc
0 1.0 a x f
1 2.0 a y g
2 7.0 b y h,j
4 11.0 c x k,l
6 6.0 c y p
解决这个问题的正确方法是什么?
另一个问题:说如果正在从.csv中读取df
并且它具有其他不相关的列,我该如何进行计算,然后将其与其他列一起写入新的.csv(相同的模式作为一读)?
答案 0 :(得分:4)
可能不是完全的骗子,但是有很多与groupby agg相关的问题
SELECT t1.firstcol,
t1.secondcol,
CASE
WHEN EXISTS (SELECT *
FROM elbat t2
WHERE t2.firstcol = t1.firstcol
AND t2.secondcol <> t1.secondcol) THEN
1
ELSE
0
END flag
FROM elbat t1;
编辑:如果数据框中还有其他列,则可以使用“第一”或“最后”来汇总它们,或者如果它们的值相同,则将它们包括在分组中。
选项1:
df.groupby(['name', 'role'], as_index=False)\
.agg({'amount':'sum', 'desc':lambda x: ','.join(x)})
name role amount desc
0 a x 1.0 f
1 a y 2.0 g
2 b y 7.0 h,j
3 c x 11.0 k,l
4 c y 6.0 p
选项2:
df.groupby(['name', 'role'], as_index=False).agg({'amount':'sum', 'desc':lambda x: ','.join(x), 'other1':'first', 'other2':'first'})
答案 1 :(得分:1)
扩展@Vaishali的答案。要处理其余的列而不必指定每一列,您可以创建一个字典并将其作为agg(regate)函数的参数。
dict = {}
for col in df:
if (col == 'column_you_wish_to_merge'):
dict[col] = ' '.join
else:
dict[col] = 'first' # or any other group aggregation operation
df.groupby(['key1', 'key2'], as_index=False).agg(dict)