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 |
我只想保留
1 2 3 | name value 0 A 1.0 1 C 3.0 |
我尝试过很多方法,但我对python和pandas还不熟悉,不喜欢r中的语法。为什么这行代码不起作用,会发生什么?
1 | df2[df2["name"] in df1["name"]] |
您可以使用
1 2 3 4 | print (df2[df2["name"].isin(df1["name"])]) name value 0 A 1.0 1 C 3.0 |
使用
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 |
把