pandas 是否使用唯一标识符将df1['colA']中的值替换为df2['ColB']?

2guxujil  于 2022-11-27  发布在  其他
关注(0)|答案(1)|浏览(129)

你好,我正试图用df2列B中的值替换df1列A中的值,基本上,如果df1['a']中第x行的字符串等于df2['a']中第y行的字符串,我想用df2['b']替换df1['a']的值。我尝试了几种方法,但由于某种原因,这种方法不能正常工作。我还想用None替换不在df2['a']中的值。
我示例数据是:
第一个
这在我的示例数据中有效,但在我的实际数据集中无效,因为实际数据集要大得多。

j91ykkif

j91ykkif1#

我认为解释不太正确。根据您的代码尝试,我怀疑您的意思是:
对于df1的每一行i(对于所有字段(a, b, c))与df2的行j匹配,则用df2.loc[j, 'c']替换df1.loc[i, 'a']
如果这是对你的问题的正确解释,那么:
首先,使用行值的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)

相关问题