Pandas:使用 groupby 根据条件替换列中的特定字符

问题描述 投票:0回答:2

我有以下数据框:

df = pd.DataFrame({
'ACCOUNT': [1, 1, 2, 2], 
'ASSET_CLASS': ['11201XX FI CHF', '11201XX FI CHF', 
                '12201XX FI EUR', '12201XX FI EUR',
               ],
})

display(df)

    ACCOUNT ASSET_CLASS     
0   1       11201XX FI CHF  
1   1       11201XX FI CHF  
2   2       12201XX FI EUR  
3   2       12201XX FI EUR  

对于帐户列表,我想分别使用 groupby 函数和“ACCOUNT”作为 groupby 变量,将“ASSET_CLASS”列中的“XX”替换为“01”和“02”。此外,值的名称还应根据分配的值进行调整。例如,如果“01”(“02”),则“FI CHF”等于“FI CHF Gov”(“FI CHF Corporate”)。它应该是这样的:

df = pd.DataFrame({
    'ACCOUNT': [1, 1, 2, 2], 
    'ASSET_CLASS': ['1120101 FI CHF Gov', '1120102 FI CHF Corporate',
                    '1220101 FI EUR Gov', '1120102 FI EUR Corporate',
                   ],
})

display(df)

    ACCOUNT ASSET_CLASS
0   1       1120101 FI CHF Gov
1   1       1120102 FI CHF Corporate
2   2       1220101 FI EUR Gov
3   2       1120102 FI EUR Corporate

提前非常感谢您的任何建议!

python pandas replace group-by conditional-statements
2个回答
2
投票

代码

s1 = df.groupby('ACCOUNT').cumcount().add(1).astype('str').str.zfill(2)
m = {'01': ' Gov', '02': ' Corporate'}
s2 = df['ASSET_CLASS'].str.split('XX')
df['ASSET_CLASS'] = s2.str[0] + s1 + s2.str[1] + s1.map(m)

df

    ACCOUNT ASSET_CLASS
0   1       1120101 FI CHF Gov
1   1       1120102 FI CHF Corporate
2   2       1220101 FI EUR Gov
3   2       1220102 FI EUR Corporate

0
投票

@Panda Kim:当然可以。这就是我的想法。假设我有以下数据框:

 df = pd.DataFrame({
    'ACCOUNT': [1, 1, 1, 1, 2, 2], 
    'ASSET_CLASS': ['11201XX FI CHF', '11201XX FI CHF', 
                    '12201XX FI EUR', '12201XX FI EUR',
                    '12201XX FI EUR', '12201XX FI EUR',
                   ],
})

display(df)


ACCOUNT ASSET_CLASS
0   1   11201XX FI CHF
1   1   11201XX FI CHF
2   1   12201XX FI EUR
3   1   12201XX FI EUR
4   2   12201XX FI EUR
5   2   12201XX FI EUR

使用您提供的输入,我获得以下信息:

s1 = df.groupby('ACCOUNT').cumcount().add(1).astype('str').str.zfill(2)
m = {'01': ' Gov', '02': ' Corporate'}
s2 = df['ASSET_CLASS'].str.split('XX')
df['ASSET_CLASS'] = s2.str[0] + s1 + s2.str[1] + s1.map(m)
df

    ACCOUNT ASSET_CLASS
0   1       1120101 FI CHF Gov
1   1       1120102 FI CHF Corporate
2   1       NaN
3   1       NaN
4   2       1220101 FI EUR Gov
5   2       1220102 FI EUR Corporate

是否能够通过考虑一个账户可能拥有两个以上资产类别的可能性来调整您的代码?理想情况下,这就是我想要得到的:

    ACCOUNT ASSET_CLASS
0   1       1120101 FI CHF Gov
1   1       1120102 FI CHF Corporate
2   1       1220101 FI EUR Gov
3   1       1220102 FI EUR Corporate
4   2       1220101 FI EUR Gov
5   2       1220102 FI EUR Corporate
© www.soinside.com 2019 - 2024. All rights reserved.