Pandas数据帧中的高级查找第2部分



我使用了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

相关内容

  • 没有找到相关文章

最新更新