对于以下两个数据帧:
df1 = pd.DataFrame({'name': pd.Series(["A", "B", "C"]), 'value': pd.Series([1., 2., 3.])})
name value
0 A 1.0
1 B 2.0
2 C 3.0
df2 = pd.DataFrame({'name': pd.Series(["A", "C", "D"]), 'value': pd.Series([1., 3., 5.])})
name value
0 A 1.0
1 C 3.0
2 D 5.0
我只想保留df2
中name
列中的值与name
的{{1}}列中的值重叠的行,即生成以下数据框:
df1
我尝试了很多方法,但我是python和pandas的新手,并且不喜欢来自R的语法。为什么这行代码不起作用,会是什么?
name value
0 A 1.0
1 C 3.0
答案 0 :(得分:4)
您可以使用isin
:
print (df2[df2["name"].isin(df1["name"])])
name value
0 A 1.0
1 C 3.0
使用numpy.intersect1d
的另一个更快的解决方案:
val = np.intersect1d(df2["name"], df1["name"])
print (val)
['A' 'C']
print (df2[df2.name.isin(val)])
name value
0 A 1.0
1 C 3.0
答案 1 :(得分:1)
对您的实际数据可能有用的略有不同的方法,您可以使用"内部联接" (交集)一个SQL。如果您的列在两个数据框中都不重复(例如,使用某些公共密钥合并两个不同的数据集),则会更有用。
UIView
将df1 = pd.DataFrame({'name': pd.Series(["A", "B", "C"]), 'value': pd.Series([1., 2., 3.])})
df2 = pd.DataFrame({'name': pd.Series(["A", "C", "D"]), 'value': pd.Series([1., 3., 5.])})
# supposedly for the join you should be able to tell join on='<column_name>', 'name' here,
# but wasn't working for me.
df1.set_index('name', inplace=True)
df2.set_index('name', inplace=True)
df1.join(df2, how='inner', rsuffix='_other')
# value value_other
# name
# A 1.0 1.0
# C 3.0 3.0
更改为how
会为您提供两者的交集,仅outer
行为left
,df1
为right
。