Pandas在组内为组的子集转换值

2024-03-29 05:14:27 发布

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

我希望在组内转换值,但仅限于系列中组的一个子集。在

我有一些类似以下系列的东西:

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组的值应该上移一个。我可以在所有组中执行此操作(如this问题中所述,如下所示:

^{pr2}$

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

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

有没有更优雅的解决办法?在


Tags: namedfgetindexvaluegroupnanout
1条回答
网友
1楼 · 发布于 2024-03-29 05:14:27
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ᴘᴇᴇᴅ)-这将大大简化解决方案:

^{pr2}$

相关问题 更多 >