Pandas在具有相同大小响应的组上应用函数

2024-05-15 11:16:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在Python中从R复制this结果。我想要应用的函数(np.diff)接受一个输入并返回一个大小相同的数组。当我尝试分组时,我得到的输出是组数的大小,而不是行数的大小

数据帧示例:

df = pd.DataFrame({'sample':[1,1,1,1,1,2,2,2,2,2],'value':[1,2,3,4,5,1,3,2,4,3]})

如果我对它应用diff,我会接近我想要的结果,除了组边界。(-4)值是一个问题

x = np.diff([df.loc[:,'value']], 1, prepend=0)[0]
df.loc[:,'delta'] = x
    sample  value   delta
0     1       1      1
1     1       2      1
2     1       3      1
3     1       4      1
4     1       5      1
5     2       1     -4
6     2       3      2
7     2       2     -1
8     2       4      2
9     2       3     -1

我认为答案是使用groupbyapplytransform,但我无法理解语法。我能得到的最接近的结果是:

df.groupby('sample').apply(lambda df: np.diff(df['value'], 1, prepend =0 ))

x
1      [1, 1, 1, 1, 1]
2    [1, 2, -1, 2, -1]

Tags: 数据sample函数dfvaluenpdiff数组
1条回答
网友
1楼 · 发布于 2024-05-15 11:16:51

这里可以使用^{},将第一个缺少的值替换为1,然后将值替换为整数:

df['delta'] = df.groupby('sample')['value'].diff().fillna(1).astype(int)
print (df)
   sample  value  delta
0       1      1      1
1       1      2      1
2       1      3      1
3       1      4      1
4       1      5      1
5       2      1      1
6       2      3      2
7       2      2     -1
8       2      4      2
9       2      3     -1

您的解决方案可以通过^{}进行更改,在groupby之后指定处理列,并在lambda函数中删除y列:

df['delta'] = df.groupby('sample')['value'].transform(lambda x: np.diff(x, 1, prepend = 0))

相关问题 更多 >