我有一个看起来像的df1:
Out[43]:
city1 city2
0 YYZ SFO
1 YYZ EWR
2 YYZ DFW
3 YYZ LAX
4 YYZ YYC
我想根据df1切片另一个df2,即df2中的city1和city2必须对应df1中相同的city1和city2对。
我只想要df2中的行,其中city1和city2列与df1中的行完全匹配。
我是否必须将dfs合并/加入作为df1上的左连接作为唯一干净的方法来执行此操作?我不想创建另一个列,其值为city1和city2的串联。这将是有效的,但必须有一个简单的方法,内置到大熊猫,而不必操纵我的数据。
更新:
df2只有2列。它共有20列。为简单起见,我只提到了city1和city2。
在任何情况下,我想返回df2中的所有行(df有20列),其中city1和city2对匹配df1中的内容。
答案 0 :(得分:2)
设置
df2 = pd.DataFrame([
['YYZ', 'SFO', 1],
['YYZ', 'YYD', 1]
], columns=['city1', 'city2', 'val'])
cols = ['city1', 'city2']
选项1
numpy
broadcasting
multi_isin_cond = (df2[cols].values[:, None] == df1[cols].values).all(-1).any(-1)
df2.loc[multi_isin_cond]
city1 city2 val
0 YYZ SFO 1
选项2
pandas
merge
df2.merge(df1, on=cols)
city1 city2 val
0 YYZ SFO 1
选项3
不知道该怎么称呼它,不推荐它。
idx = pd.MultiIndex.from_arrays(df1.values.T, names=df1.columns)
df2[df2[cols].apply(tuple, 1).isin(idx)]
city1 city2 val
0 YYZ SFO 1
答案 1 :(得分:0)
您无需加入。这是一种方法。
import pandas as pd
z = {'city1' : pd.Series(['YYZ', 'YYZ','YYZ','YYZ']), 'city2' : pd.Series(['SFO', 'EWR', 'DFW', 'LAX'])}
df = pd.DataFrame(z)
x = {'city1' : pd.Series(['YYZ', 'YYX','YYZ','YYX']), 'city2' : pd.Series(['SFO', 'EWR', 'DFW', 'LAX'])}
df1 = pd.DataFrame(x)
df.head()
city1 city2
0 YYZ SFO
1 YYZ EWR
2 YYZ DFW
3 YYZ LAX
df1.head()
city1 city2
0 YYZ SFO
1 YYX EWR
2 YYZ DFW
3 YYX LAX
condition = df['city1'] == df1['city1']
df[(condition)]
city1 city2
0 YYZ SFO
2 YYZ DFW