你好,我正试图用df2列B中的值替换df1列A中的值,基本上,如果df1['a']中第x行的字符串等于df2['a']中第y行的字符串,我想用df2['b']替换df1['a']的值。我尝试了几种方法,但由于某种原因,这种方法不能正常工作。我还想用None替换不在df2['a']中的值。我示例数据是:第一个这在我的示例数据中有效,但在我的实际数据集中无效,因为实际数据集要大得多。
j91ykkif1#
我认为解释不太正确。根据您的代码尝试,我怀疑您的意思是:对于df1的每一行i(对于所有字段(a, b, c))与df2的行j匹配,则用df2.loc[j, 'c']替换df1.loc[i, 'a']。如果这是对你的问题的正确解释,那么:首先,使用行值的tuple作为行的UID比字符串串联更安全:想象一行'_', 'foo', 'bar'和另一行'_', 'fooba', 'r'--它们肯定是不同的。tuple的第二个优点是它可以处理其他类型,而不仅仅是字符串。例如:
df1
i
(a, b, c)
df2
j
df2.loc[j, 'c']
df1.loc[i, 'a']
tuple
UID
'_', 'foo', 'bar'
'_', 'fooba', 'r'
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)
1条答案
按热度按时间j91ykkif1#
我认为解释不太正确。根据您的代码尝试,我怀疑您的意思是:
对于
df1
的每一行i
(对于所有字段(a, b, c)
)与df2
的行j
匹配,则用df2.loc[j, 'c']
替换df1.loc[i, 'a']
。如果这是对你的问题的正确解释,那么:
首先,使用行值的
tuple
作为行的UID
比字符串串联更安全:想象一行'_', 'foo', 'bar'
和另一行'_', 'fooba', 'r'
--它们肯定是不同的。tuple
的第二个优点是它可以处理其他类型,而不仅仅是字符串。例如:然后,通过在
UID
上合并可以获得预期结果: