关于python:子集pandas数据帧与另一个重叠

Subset pandas dataframe by overlap with another

本问题已经有最佳答案,请猛点这里访问。

对于以下两个数据帧:

1
2
3
4
5
6
7
8
9
10
11
12
13
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列中的值重叠,即生成以下数据帧:

1
2
3
     name  value
0    A    1.0
1    C    3.0

我尝试过很多方法,但我对python和pandas还不熟悉,不喜欢r中的语法。为什么这行代码不起作用,会发生什么?

1
df2[df2["name"] in df1["name"]]


您可以使用isin

1
2
3
4
print (df2[df2["name"].isin(df1["name"])])
  name  value
0    A    1.0
1    C    3.0

使用numpy.intersect1d的另一个更快的解决方案:

1
2
3
4
5
6
7
8
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


稍微不同的方法可能对实际数据有用,您可以使用一个"内部连接"(交叉点)一个LASQL。如果两个数据帧中的列都不重复(例如,用某个公共键合并两个不同的数据集),则更有用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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只对df2行。