假设我有一个df1(有更多的列,但只有这一个是相关的):
A
a1
a2
a3
和类似的df2:
A
a1
a3
a4
a7
这种情况是df2在列A中包含df1中的一些值(df1和df2中的列名相同),但不是全部。现在,我想添加一个列"Found in df2?"到一个df1,表示是否找到了该值。例子:
df1
A Found in df2?
a1 Y
a2 N
a3 Y
我试过np。在哪里和一些合并魔法,但我无法理解这一点。
您可以使用isin
:
df['found in df2'] = df['A'].isin(df2['A'].values)
print(df)
A found in df2
0 a1 True
1 a2 False
2 a3 True
设置
df = pd.DataFrame({'A':['a1','a2','a3']})
df2 = pd.DataFrame({'A':['a1','a3','a4','a7']})
如果使用pandas不能解决您的问题,我建议您将它们转换为列表/数组,这样更容易使用。
这里有一种解决方法:
import pandas as pd
df1 = pd.DataFrame({
'A': [1,2,3]
})
df2 = pd.DataFrame({
'A': [1,3,4,7]
})
df1['Found in df2?'] = ['Y' if x in df2['A'].values else 'N' for x in df1['A'].values]
display(df1)
Pandas merge有一个指示符特性,告诉您在merge的哪一边找到了一个值。
:
dfm = pd.merge(df1, df2[['A']], how="left", indicator=True)
dfm['Found in df2'] = dfm["_merge"] == "both"
你得到一个列_merge
,它告诉你"left_only"或";both"这取决于找到A值的位置。如果您想知道哪些值也只在df2
中,请使用how="outer"
。
现在,merge可能会根据a的顺序对df1中的行重新排序。如果需要,请参阅关于SO如何抵消这种情况的其他问题。