gpt4 book ai didi

python - Pandas 在组内移动组子集的值

转载 作者:行者123 更新时间:2023-12-01 02:26:31 25 4
gpt4 key购买 nike

我希望改变组内的值,但仅限于系列中组的子集。

我有类似以下系列的内容:

import pandas as pd
df=pd.DataFrame()
df['Group']=['A','A','A','B','B','B','C','C','C']
df['Month']=[1,2,3,1,2,3,1,2,3]
df['Value']=1000,900,800,700,600,500,400,300,200
df=df.set_index(['Group','Month'])['Value']
df
Out[101]:
Group Month
A 1 1000
2 900
3 800
B 1 700
2 600
3 500
C 1 400
2 300
3 200
Name: Value, dtype: int64

我希望 A 组保持原样,但 B 组和 C 组的值应该增加 1。我可以在所有组中执行此操作(如 this 问题中所述,如下所示:

 df.groupby(level='Group').transform(lambda x:x.shift(-1))

但是,要仅对组的子集执行此操作,我想不出比分离系列然后重新连接在一起更优雅的方法,如下所示:

df_a = df[df.index.get_level_values('Group')=='A']
df_other = df[df.index.get_level_values('Group')<>'A']

pd.concat([df_a,df_other.groupby(level='Group').transform(lambda x:x.shift(-1))])
Out[104]:
Group Month
A 1 1000.0
2 900.0
3 800.0
B 1 600.0
2 500.0
3 NaN
C 1 300.0
2 200.0
3 NaN
Name: Value, dtype: float64

有没有更优雅的解决方案?

最佳答案

In [361]: df.groupby(level='Group').transform(lambda x:x if x.name=='A' else x.shift(-1))
Out[361]:
Group Month
A 1 1000.0
2 900.0
3 800.0
B 1 600.0
2 500.0
3 NaN
C 1 300.0
2 200.0
3 NaN
Name: Value, dtype: float64

或者您可以仅更新特定行 ( solution provided by @cᴏʟᴅsᴘᴇᴇᴅ ) - 这将大大简化解决方案:

In [363]: df.loc[['B', 'C']] = df.loc[['B', 'C']].groupby(level=0).shift(-1)

In [364]: df
Out[364]:
Group Month
A 1 1000.0
2 900.0
3 800.0
B 1 600.0
2 500.0
3 NaN
C 1 300.0
2 200.0
3 NaN
Name: Value, dtype: float64

关于python - Pandas 在组内移动组子集的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47336626/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com