使用重叠部分来筛选Pandas数据框的子集

4
以下是两个数据框:

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列的值与df1name列中的值有重叠的行,即产生以下数据框:

     name  value
0    A    1.0
1    C    3.0

我尝试了几种方法,但我对Python和Pandas都很陌生,不太理解R语言的语法。为什么这行代码不能运行,应该怎么改正?

df2[df2["name"] in df1["name"]]
2个回答

6
你可以使用 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

我相信如果索引不同,这将无法工作。 - loco.loop
https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.join.html - loco.loop

1
稍微不同的方法可能对您的实际数据有用,您可以使用类似于SQL的“内连接”(交集)。如果您的列在两个数据框中没有重复(例如,将具有某些共同键的两个不同数据集合并),则更有用。
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将给出两个交集,对于仅df1行的left,对于df2right

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接