【问题标题】:replacing a value from df1['colA'] with df2['ColB'] using a unique identifier?使用唯一标识符将 df1[\'colA\'] 中的值替换为 df2[\'ColB\'] ?
【发布时间】:2022-11-27 13:04:35
【问题描述】:

您好我正在尝试将 df1 列 A 中的值替换为 df2 列 B 中的值,方法是将它们与 df2 列 A 进行匹配。基本上,如果 df1['a'] 中行 x 的字符串等于行 y 中的字符串df2['a'] 我想用 df2['b'] 替换 df1['a'] 的值。我已经尝试了几件事,但由于某种原因,这无法正常工作。我还想用 None 替换不在 df2['a'] 中的值。

我的示例数据是:

df1 = pd.DataFrame({'a': ['a','b','a','d','e','f','g', 'h', 'i'],
                    'b': ['alpha', 'alpha', 'alpha', 'beta', 'beta', 'charlie', 'charlie', "alpha", "beta"],
                    'c': ['elephant', "zebra",'elephant', "zebra",'elephant', "zebra",'elephant','elephant', "zebra"]})

df2 = pd.DataFrame({'a': ['a','b','c','d','e','f','g'], 
                    'b': ['alpha', 'alpha', 'alpha', 'beta', 'beta', 'charlie', 'charlie'],
                    'c': ['elephant', "zebra",'elephant', "zebra",'elephant', "zebra",'elephant']})
df1['UID'] = df1['a']+ df1['b']+df1['c']
df2['UID'] = df2['a']+ df2['b']+df2['c']
df1['a'].loc[df1['UID'].isin(df2['UID'])] = df2['c']
animals = ['elephant','zebra']
df1.loc[~df1['a'].isin(animals), "a"] = "None"

这适用于我的样本数据,但不适用于我的实际数据集,因为它要大得多。关于如何做类似的事情的任何想法?

【问题讨论】:

  • 你确定逻辑吗? df1['a'] 只包含'a''b' 等。df2 也是如此。 “x 行的字符串”是什么意思?

标签: python pandas dataframe


【解决方案1】:

我认为这个解释不太正确。根据您的代码尝试,我怀疑您的意思是:

对于df1的每一行i匹配(对于所有字段(a, b, c)df2的一行j,然后将df1.loc[i, 'a']替换为df2.loc[j, 'c']

如果那是对您问题的正确解释,那么:

首先,使用行值的 tuple 作为行的 UID 比字符串连接更安全:想象一行 '_', 'foo', 'bar' 和另一行 '_', 'fooba', 'r' —— 它们肯定是不同的。 tuple 的第二个优点是它适用于其他类型,而不仅仅是字符串。因此:

df1['UID'] = df1[['a', 'b', 'c']].apply(tuple, axis=1)
df2['UID'] = df2[['a', 'b', 'c']].apply(tuple, axis=1)

那么,在UID上合并就可以得到预期的结果:

df = df1.assign(
    a=df1.merge(
        df2[['UID', 'c']], on='UID', how='left',
        suffixes=['', '_y'])['c_y'].fillna('None')
)

>>> df
          a        b         c                     UID
0  elephant    alpha  elephant    (a, alpha, elephant)
1     zebra    alpha     zebra       (b, alpha, zebra)
2  elephant    alpha  elephant    (a, alpha, elephant)
3     zebra     beta     zebra        (d, beta, zebra)
4  elephant     beta  elephant     (e, beta, elephant)
5     zebra  charlie     zebra     (f, charlie, zebra)
6  elephant  charlie  elephant  (g, charlie, elephant)
7      None    alpha  elephant    (h, alpha, elephant)
8      None     beta     zebra        (i, beta, zebra)

【讨论】:

    猜你喜欢
    • 2021-11-04
    • 1970-01-01
    • 2017-02-06
    • 2021-11-27
    • 1970-01-01
    • 2018-11-02
    • 1970-01-01
    • 2014-04-12
    • 1970-01-01
    相关资源
    最近更新 更多