python-3.x - 如何使用 group by 移动 pandas 列值并使用 python 创建新列?

标签 python-3.x pandas

我有一个数据框:

    T   B   C   D   value
    0   USP JDF PG  0.956350953
    1   USP JDF PG  0.73231087
    2   USP JDF PG  0.560755661
    3   USP JDF PG  0.429389928
    4   USP JDF PG  0.32879866
    5   USP JDF PG  0.251772461

    0   PSP MRF PM  0.192790847
    1   PSP MRF PM  0.147626593
    2   PSP MRF PM  0.113042768
    3   PSP MRF PM  0.086560742
    4   PSP MRF PM  0.066282542
    5   PSP MRF PM  0.050754826

对于按B、C、D分组,我想为值创建新的移位列,然后计算差异。

这是我想要的输出。

    A   B   C   D   value        shift       diff
    0   USP JDF PG  0.956350953 0.73231087  0.224040083
    1   USP JDF PG  0.73231087  0.560755661 0.171555209
    2   USP JDF PG  0.560755661 0.429389928 0.131365733
    3   USP JDF PG  0.429389928 0.32879866  0.100591268
    4   USP JDF PG  0.32879866  0.251772461 0.077026199
    5   USP JDF PG  0.251772461 null    null

    0   PSP MRF PM  0.192790847 0.147626593 0.045164254
    1   PSP MRF PM  0.147626593 0.113042768 0.034583825
    2   PSP MRF PM  0.113042768 0.086560742 0.026482026
    3   PSP MRF PM  0.086560742 0.066282542 0.0202782
    4   PSP MRF PM  0.066282542 0.050754826 0.015527716
    5   PSP MRF PM  0.050754826 null    nul

diff=value-shift

我尝试使用此代码:

df['shift'] = df.groupby(['B', 'C','D'])['value'].shift(-1)

但是没有成功。

最佳答案

纯 Vanilla

g = df.groupby(['B', 'C', 'D']).value
df.assign(shift=g.shift(-1), diff=g.diff(-1))

    A    B    C   D     value     shift      diff
0   0  USP  JDF  PG  0.956351  0.732311  0.224040
1   1  USP  JDF  PG  0.732311  0.560756  0.171555
2   2  USP  JDF  PG  0.560756  0.429390  0.131366
3   3  USP  JDF  PG  0.429390  0.328799  0.100591
4   4  USP  JDF  PG  0.328799  0.251772  0.077026
5   5  USP  JDF  PG  0.251772       NaN       NaN
6   0  PSP  MRF  PM  0.192791  0.147627  0.045164
7   1  PSP  MRF  PM  0.147627  0.113043  0.034584
8   2  PSP  MRF  PM  0.113043  0.086561  0.026482
9   3  PSP  MRF  PM  0.086561  0.066283  0.020278
10  4  PSP  MRF  PM  0.066283  0.050755  0.015528
11  5  PSP  MRF  PM  0.050755       NaN       NaN

管道

df.groupby(['B', 'C', 'D']).value.pipe(
    lambda g: df.assign(shift=g.shift(-1), diff=g.diff(-1))
)

    A    B    C   D     value     shift      diff
0   0  USP  JDF  PG  0.956351  0.732311  0.224040
1   1  USP  JDF  PG  0.732311  0.560756  0.171555
2   2  USP  JDF  PG  0.560756  0.429390  0.131366
3   3  USP  JDF  PG  0.429390  0.328799  0.100591
4   4  USP  JDF  PG  0.328799  0.251772  0.077026
5   5  USP  JDF  PG  0.251772       NaN       NaN
6   0  PSP  MRF  PM  0.192791  0.147627  0.045164
7   1  PSP  MRF  PM  0.147627  0.113043  0.034584
8   2  PSP  MRF  PM  0.113043  0.086561  0.026482
9   3  PSP  MRF  PM  0.086561  0.066283  0.020278
10  4  PSP  MRF  PM  0.066283  0.050755  0.015528
11  5  PSP  MRF  PM  0.050755       NaN       NaN

关于python-3.x - 如何使用 group by 移动 pandas 列值并使用 python 创建新列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61374527/

相关文章:

python - 按一列或另一列对 pandas 数据框进行分组

python - 如何反转 pandas 系列

python - 后面加*args可以使用默认参数吗?

python - Pandas - 在列中的 groupby 之后连接字符串,忽略 NaN,忽略重复项

python - 随机选择元组中的值

python - Pandas Groupby Dates,然后是 Group 的 Cumprod?

python - 基于 Python 列表从 yaml 文件中检索数据

python - 在 Pandas 中按类别比较

python - 如何将使用实例变量的实例方法作为参数传递给另一个函数?

Python 3 读取行内缺少对象的 json 文件