【发布时间】:2021-11-30 14:21:06
【问题描述】:
我使用了我之前提出的来自 Stef 的以下解决方案。请先阅读链接中的问题:Advanced lookups in Pandas Dataframe
但是,我现在遇到的问题是,当我有其他以 8409 结尾的帐户没有相应的 8400 帐户时,8409 会返回 level2 的 NaN 值。如果 8409 没有对应的帐户,那么它应该在“level2”列中保留其当前值。
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 列中保留其初始值。
如果有人对此有解决方法,请提前致谢?
【问题讨论】:
-
您希望在这里做什么?行为是完全正常的,你改变一个值,在列上合并,不匹配的值上有一个 NaN……
-
账户 1111118409 的不匹配情况需要在列 level2 中保留其原始值,而不是 NaN。程序需要搜索账户 8409 是否有对应的 8400 账户,如果有,将 level2 值从 8400 账户替换为按预期工作的 8409 账户。但是,当没有找到匹配项时,8409 帐户将保留其原始值,否则在这些情况下它会继续返回 NaN。
-
原始解决方案仅在始终存在相应匹配时才考虑在内,这就是问题所在。
-
我明白了,我提供了一个实用的解决方案;)
标签: python pandas dataframe numpy