【问题标题】:Advanced lookups in Pandas Dataframe Part 2Pandas Dataframe 中的高级查找第 2 部分
【发布时间】: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


【解决方案1】:

这是一个应该可以按预期工作的解决方案:

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

【讨论】:

  • 那是一种享受。然而,我确实忽略了另一个变量。我已经更新了上面的原始帖子。这是货币列,这些匹配仅适用于美元账户,不适用于任何其他货币。所有其他货币仅保留其在 level2 中的内容。抱歉,我可以将其添加到新主题中,因为您确实解决了我最初发布的内容?告诉我。
  • @AlanPaul 那么你应该在公共列上使用左连接/合并,然后应用 combine_first 将 NaN 替换为原始值
  • 好吧,让我试试
  • 看起来我现在遇到的问题可能是包含相同数字但货币不同的帐号 - 结果出现以下错误InvalidIndexError: Reindexing only valid with uniquely valued Index objects
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-26
相关资源
最近更新 更多