Python3 Pandas自定义分组对行或者对列求和方法
本帖最后由 shojnhv 于 2021-1-23 11:54 编辑Python3环境下,使用Pandas,根据自己任意定义的分组规则,对DataFrame的行或者列进行分组求和操作,得到新的DataFrame,我总感觉我的方法很笨,有没有更简单的方法,我的代码如下
1、对行求和代码:
代码:
import pandas as pd
df=pd.DataFrame({'type':['a','b','a','c','a','b'],
'count':
}
)
print('Input:')
print(df)
groups=[('A1',['a','b']),
('A1',['a','c']),
('A2',['a','b','c']),
('A3',['a','b','c','d']),
('B1',['b','c','d']),
('E1',['e','f','d'])
]
d={'type':[],'count':[]}
for group_name,group_items in groups:
d['type'].append(group_name)
d['count'].append(df.loc.isin(group_items),'count'].sum())
result=pd.DataFrame(d)
print('Result:')
print(result)
运行结果:
Input:
typecount
0 a 0
1 b 3
2 a 1
3 c 5
4 a 2
5 b 4
Result:
typecount
0 A1 10
1 A1 8
2 A2 15
3 A3 15
4 B1 12
5 E1 0
2、对列求和:
代码:
import pandas as pd
df=pd.DataFrame({'a':,
'b':,
'c':,
}
)
print('Input:')
print(df)
groups=[('A1',['a','b']),
('A1',['a','c']),
('A2',['a','b','c']),
('A3',['a','b','c','d']),
('B1',['b','c','d']),
('E1',['e','f','d'])
]
d={}
for group_name,group_items in groups:
d=.sum() for k in group_items if k in df.columns])]
result=pd.DataFrame(d)
print('Result:')
print(result)
运行结果:
Input:
abc
0212
1305
2434
37 -12
Result:
A1A2A3B1E1
029323216 0
{:301_998:}不太清楚你在groups里放了俩"A1"值还不同,实际用途是啥……如果不重复的话,我本来想通过 df和groups合并来完成后面的运算。现在应该需要用到pivot
另外不知分行与分列的计算,用途是啥?因为A1A2A3B1E1这些无论从行还是从列,最后sum的结果都是一样的 rsnodame 发表于 2021-1-23 13:23
不太清楚你在groups里放了俩"A1"值还不同,实际用途是啥……如果不重复的话,我本来想通过 df和 ...
重复的A1是我故意放置的重复组名,如果在没有重复组名的情况下是不是有更好的算法?对于行或者列的计算,只是想知道行和列的不同算法及代码用法。因为有些数据的分组是按照行来分组,有些则按照列来分组,需求情况不同,解法也有不同 shojnhv 发表于 2021-1-23 13:27
重复的A1是我故意放置的重复组名,如果在没有重复组名的情况下是不是有更好的算法?对于行或者列的计算, ...
核心是怎么实现对df行或列的索引,并可以用推导式改进。
比如,对行求和代码
{i:df.loc.isin(j),'count'].sum().sum() for i,j in groups}
# {'A1': 10, 'A2': 15, 'A3': 15, 'B1': 12, 'E1': 0}
rsnodame 发表于 2021-1-23 22:08
核心是怎么实现对df行或列的索引,并可以用推导式改进。
比如,对行求和代码
多谢,这个其实也是字典的另外一种写法,有没有直接用pandas groupby的方法一次实现的方法,我是没有找到 shojnhv 发表于 2021-1-23 23:12
多谢,这个其实也是字典的另外一种写法,有没有直接用pandas groupby的方法一次实现的方法,我是没有找到
{:17_1062:}感觉groupby不行。想了一个办法,就是把groups转为df后操作,但是开销太大,只能当做游戏玩玩
gdf = pd.DataFrame(groups,columns=['tag','type'])
gdf = gdf.explode(column='type').pivot(index='type',columns='tag',values='type')
''' 大概是这样子
tag A1 A2 A3 B1 E1
type
a a a aNaNNaN
b b b b bNaN
c NaN c c cNaN
d NaNNaN d d d
e NaNNaNNaNNaN e
f NaNNaNNaNNaN f
'''
df1 = df.reindex(columns = dd.index)
''' 大致是这样子
typeabc d e f
0 212 NaN NaN NaN
1 305 NaN NaN NaN
2 434 NaN NaN NaN
3 7 -12 NaN NaN NaN
'''
gdf.agg(lambda s: df1.loc[:,s.notna()].sum().sum())
'''
tag
A1 19.0
A2 32.0
A3 32.0
B1 16.0
E1 0.0
dtype: float64
'''
rsnodame 发表于 2021-1-24 00:21
感觉groupby不行。想了一个办法,就是把groups转为df后操作,但是开销太大,只能当做游戏玩玩 ...
好吧,多谢了,还是用原来的方法吧
页:
[1]