Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将用户定义的函数应用于多列上的分组数据帧_Python_Pandas_Dataframe - Fatal编程技术网

Python 将用户定义的函数应用于多列上的分组数据帧

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],

我想将函数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],
                ['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