我使用了Stef之前提出的以下解决方案。请先阅读链接中的问题:Pandas数据帧中的高级查找
然而,我现在遇到的问题是,当我有其他以8409结尾的帐户,但没有相应的8400帐户时,8409会返回级别2的NaN值。如果8409没有相应的帐户,那么它只应将其当前值保留在"0"中;级别2";柱
import pandas as pd
import numpy as np
df = pd.DataFrame([['USD',7854568400,489],
['USD',9632588400,126],
['USD',3699633691,189],
['USD',9876543697,987],
['EUR',1111118409,987],
['USD',1111118409,987],
['USD',7854568409,396],
['USD',7854567893,897],
['USD',9632588409,147]],
columns = ['cur','level1','level2'])
输出:
cur level1 level2
0 USD 7854568400 489
1 USD 9632588400 126
2 USD 3699633691 189
3 USD 9876543697 987
4 EUR 1111118409 987
5 USD 1111118409 987
6 USD 7854568409 396
7 USD 7854567893 897
8 USD 9632588409 147
我应用了以下解决方案:
df.level2 = df.merge(df.assign(level1 = df.level1.astype(str).str.replace('8409$', '8400', regex=True).astype('int64')), on='level1', how='right')['level2_x']
电流输出:
cur level1 level2
0 USD 7854568400 489.0
1 USD 9632588400 126.0
2 USD 3699633691 189.0
3 USD 9876543697 987.0
4 EUR 1111118409 NaN
5 USD 1111118409 NaN
6 USD 7854568409 489.0
7 USD 7854567893 897.0
8 USD 9632588409 126.0
索引4是一个问题,因为没有相应的8400帐户,它返回了NaN,但所需的输出应在列级别2中保留其初始值。
如果有人对此有变通办法,请提前感谢?
这里有一个应该如您所期望的那样工作的解决方案:
maps = df.set_index('level1')['level2']
s = df['level1'].astype(str).str.replace('8409$', '8400', regex=True).astype('int64')
df['new_level2'] = s.map(maps).combine_first(df['level2']).convert_dtypes()
输出:
level1 level2 new_level2
0 7854568400 489 489
1 9632588400 126 126
2 3699633691 189 189
3 9876543697 987 987
4 1111118409 987 987
5 7854568409 396 489
6 7854567893 897 897
7 9632588409 147 126