shojnhv 发表于 2021-1-23 11:49

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

rsnodame 发表于 2021-1-23 13:23

{:301_998:}不太清楚你在groups里放了俩"A1"值还不同,实际用途是啥……如果不重复的话,我本来想通过 df和groups合并来完成后面的运算。现在应该需要用到pivot
另外不知分行与分列的计算,用途是啥?因为A1A2A3B1E1这些无论从行还是从列,最后sum的结果都是一样的

shojnhv 发表于 2021-1-23 13:27

rsnodame 发表于 2021-1-23 13:23
不太清楚你在groups里放了俩"A1"值还不同,实际用途是啥……如果不重复的话,我本来想通过 df和 ...

重复的A1是我故意放置的重复组名,如果在没有重复组名的情况下是不是有更好的算法?对于行或者列的计算,只是想知道行和列的不同算法及代码用法。因为有些数据的分组是按照行来分组,有些则按照列来分组,需求情况不同,解法也有不同

rsnodame 发表于 2021-1-23 22:08

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}

shojnhv 发表于 2021-1-23 23:12

rsnodame 发表于 2021-1-23 22:08
核心是怎么实现对df行或列的索引,并可以用推导式改进。

比如,对行求和代码


多谢,这个其实也是字典的另外一种写法,有没有直接用pandas groupby的方法一次实现的方法,我是没有找到

rsnodame 发表于 2021-1-24 00:21

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
'''

shojnhv 发表于 2021-1-24 09:28

rsnodame 发表于 2021-1-24 00:21
感觉groupby不行。想了一个办法,就是把groups转为df后操作,但是开销太大,只能当做游戏玩玩 ...

好吧,多谢了,还是用原来的方法吧
页: [1]
查看完整版本: Python3 Pandas自定义分组对行或者对列求和方法