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

xpcnnkqh  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(93)

我有以下的框架:

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

字符串
对于账户列表,我想将“ASSET_CLASS”列中的“XX”分别替换为“01”和“02”,分别使用groupby函数和“ACNOW”作为groupby变量。此外,值的名称应根据分配的值进行调整。例如,如果“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


非常感谢提前任何建议!

a64a0gku

a64a0gku1#

验证码

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


更新我的回答与补充问题
当帐户有瑞士法郎和欧元都,你想分裂他们使用以下代码
举例说明:

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',
                   ],
})


验证码:

s1 = df.groupby(['ACCOUNT', df['ASSET_CLASS'].str.split(' ').str[-1]]).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       1220101 FI EUR Gov
3   1       1220102 FI EUR Corporate
4   2       1220101 FI EUR Gov
5   2       1220102 FI EUR Corporate

9nvpjoqh

9nvpjoqh2#

@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

相关问题