吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1356|回复: 6
收起左侧

[讨论] Python3 Pandas自定义分组对行或者对列求和方法

[复制链接]
shojnhv 发表于 2021-1-23 11:49
本帖最后由 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':[0,3,1,5,2,4]
                              }
                            )
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[df['type'].isin(group_items),'count'].sum())

result=pd.DataFrame(d)

print('Result:')
print(result)

运行结果:
Input:
  type  count
0    a      0
1    b      3
2    a      1
3    c      5
4    a      2
5    b      4
Result:
  type  count
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':[2,3,4,7],
                               'b':[1,0,3,-1],
                               'c':[2,5,4,2],
                              }
                            )
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[group_name]=[sum([df[k].sum() for k in group_items if k in df.columns])]

result=pd.DataFrame(d)

print('Result:')
print(result)

运行结果:
Input:
   a  b  c
0  2  1  2
1  3  0  5
2  4  3  4
3  7 -1  2
Result:
   A1  A2  A3  B1  E1
0  29  32  32  16   0

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

rsnodame 发表于 2021-1-23 13:23
不太清楚你在groups里放了俩"A1"值还不同,实际用途是啥……如果不重复的话,我本来想通过 df和groups合并来完成后面的运算。现在应该需要用到pivot
另外不知分行与分列的计算,用途是啥?因为A1  A2  A3  B1  E1这些无论从行还是从列,最后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行或列的索引,并可以用推导式改进。

比如,对行求和代码
[Python] 纯文本查看 复制代码
{i:df.loc[df['type'].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的方法一次实现的方法,我是没有找到

感觉groupby不行。想了一个办法,就是把groups转为df后操作,但是开销太大,只能当做游戏玩玩
[Python] 纯文本查看 复制代码
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    a  NaN  NaN
b       b    b    b    b  NaN
c     NaN    c    c    c  NaN
d     NaN  NaN    d    d    d
e     NaN  NaN  NaN  NaN    e
f     NaN  NaN  NaN  NaN    f
'''
df1 = df.reindex(columns = dd.index)
''' 大致是这样子
type  a  b  c   d   e   f
0     2  1  2 NaN NaN NaN
1     3  0  5 NaN NaN NaN
2     4  3  4 NaN NaN NaN
3     7 -1  2 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后操作,但是开销太大,只能当做游戏玩玩 ...

好吧,多谢了,还是用原来的方法吧
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止回复与主题无关非技术内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-4-27 11:23

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表