子集pandas数据框与另一个

时间:2016-12-20 17:02:41

标签: python pandas

对于以下两个数据帧:

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

我只想保留df2name列中的值与name的{​​{1}}列中的值重叠的行,即生成以下数据框:

df1

我尝试了很多方法,但我是python和pandas的新手,并且不喜欢来自R的语法。为什么这行代码不起作用,会是什么?

     name  value
0    A    1.0
1    C    3.0

2 个答案:

答案 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行为leftdf1right