基于2列值的条件切片

时间:2016-12-23 15:46:15

标签: python pandas

我有一个看起来像的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中的内容。

2 个答案:

答案 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