Python 将用户定义的函数应用于多列上的分组数据帧
我想将函数f1按组应用于数据帧:Python 将用户定义的函数应用于多列上的分组数据帧,python,pandas,dataframe,Python,Pandas,Dataframe,我想将函数f1按组应用于数据帧: import pandas as pd import numpy as np data = np.array([['id1','id2','u','v0','v1'], ['A','A',10,1,7], ['A','A',10,2,8], ['A','B',20,3,9], ['B','A',10,4,10],
import pandas as pd
import numpy as np
data = np.array([['id1','id2','u','v0','v1'],
['A','A',10,1,7],
['A','A',10,2,8],
['A','B',20,3,9],
['B','A',10,4,10],
['B','B',30,5,11],
['B','B',30,6,12]])
z = pd.DataFrame(data = data[1:,:], columns=data[0,:])
def f1(u,v):
return u*np.cumprod(v)
函数的结果取决于u列和v0或v1列(可能是数千v,因为我在很多路径上进行模拟)
结果应该是这样的
id1 id2 new_v0 new_v1
0 A A 10 70
1 A A 20 560
2 A B 60 180
3 B A 40 100
4 B B 150 330
5 B B 900 3960
我试着开始
output=z.groupby(['id1','id2'])。应用(lambda x:f1(u=x.u,v=x.v0))
但我甚至不能用一列就得到结果
多谢各位 您创建数据帧的方式,将
数值
转换为对象
,我们首先转换,然后使用分组方式
+cumprod
z[['u','v0','v1']]=z[['u','v0','v1']].apply(pd.to_numeric)
s=z.groupby(['id1','id2'])[['v0','v1']].cumprod().mul(z['u'],0)
#z=z.join(s.add_prefix('New_'))
v0 v1
0 10 70
1 20 560
2 60 180
3 40 100
4 150 330
5 900 3960
如果要处理多于2个v列,最好不要引用它
(
z.apply(lambda x: pd.to_numeric(x, errors='ignore'))
.groupby(['id1', 'id2']).apply(lambda x: x.cumprod().mul(x.u.min()))
)
您可以筛选以
v
开头的列名,然后创建一个列表并将其传递到groupby下:
v_cols = z.columns[z.columns.str.startswith('v')].tolist()
z[['u']+v_cols] = z[['u']+v_cols].apply(pd.to_numeric)
out = z.assign(**z.groupby(['id1','id2'])[v_cols].cumprod()
.mul(z['u'],axis=0).add_prefix('new_'))
print(out)
您确定您发布的所需输出是正确的吗?特别是我纠正的前两排,汉克斯·安基。赋值中**的用途是什么?@LucaMonno它是一个关键字arguments或kwargs,您可以阅读更基本的内容这将数据帧视为字典,其中键被解包为列,值被解包为这些列的值
id1 id2 u v0 v1 new_v0 new_v1
0 A A 10 1 7 10 70
1 A A 10 2 8 20 560
2 A B 20 3 9 60 180
3 B A 10 4 10 40 100
4 B B 30 5 11 150 330
5 B B 30 6 12 900 3960