使用布尔索引时合并两个数据帧(过滤)

时间:2016-07-25 19:08:23

标签: python pandas merge boolean

我有一个与语法相关的简单问题,但无法弄清楚。

我有两个数据框,df1和df2,我想a)合并特定列,而b)同时检查每个数据帧中的另一列是否有布尔关系(>,<,或=) =)。

关键部分是我需要同时执行a和b两者,因为数据帧非常大。在一步中简单地合并两个数据帧是不行的,然后在第二步中删除不通过布尔逻辑的行。这是因为合并的数据帧非常非常大,导致我的内存耗尽。

所以,我有:

df1:
    Col_1   Col_2   Test_Value
0   A       B       1
1   B       A       3
2   A       B       2
3   B       A       5
4   A       B       2
5   B       A       1

df2:
    Col_1   Col_2   Test_Value
0   A       B       1
1   B       A       3
2   A       B       2
3   B       A       5
4   A       B       2
5   B       A       1

(为简单起见,两个数据帧完全相同)

我希望合并它们,就像这样:

df3 = pd.merge(df1, df2, left_on=['Col_1'], right_on=['Col_2'])

同时过滤df1 ['Test Value']小于df2 ['Test Value']的任何行,如下所示:

df3.loc[df3['Test_Value_x'] < df3['Test_Value_y']]

结果将是:

    Col_1_x Col_2_x Test_Value_x    Col_1_y Col_2_y Test_Value_y
0   A       B       1               B       A       3
1   A       B       1               B       A       5
3   A       B       2               B       A       3
4   A       B       2               B       A       5
6   A       B       2               B       A       3
7   A       B       2               B       A       5
16  B       A       1               A       B       2
17  B       A       1               A       B       2

同样,我可以用上面的代码分两步完成这个步骤,但它会给我带来内存问题,因为中间数据框会很大。

因此有可能将此结合的语法

df3 = pd.merge(df1, df2, left_on=['Col_1'], right_on=['Col_2'])

有了这个,

df3.loc[df3['Test_Value_x'] < df3['Test_Value_y']]

1 个答案:

答案 0 :(得分:1)

试试这个:

import pandas as pd

df1_col1 = pd.Series(['A', 'B', 'A', 'B', 'A', 'B'], index=[0, 1, 2, 3, 4, 5 ])
df1_col2 = pd.Series(['B', 'A', 'B', 'A', 'B', 'A'], index=[0, 1, 2, 3, 4, 5])
df1_col3 = pd.Series([1, 3, 2, 5, 2, 1], index=[0, 1, 2, 3, 4, 5])
df1 = pd.concat([df1_col1, df1_col2, df1_col3], axis=1)

df1 = df1.rename(columns={0: 'Col_1', 1: 'Col_2', 2: 'Test_Value'})
df2 = df1.copy(deep=True)

如上所述回答您的问题:

df3 = pd.merge(df1, df2, left_on=['Col_1'], right_on=['Col_2'])[pd.merge(df1, df2, left_on=['Col_1'], right_on=['Col_2'])['Test_Value_x']
      <pd.merge(df1, df2, left_on=['Col_1'], right_on=['Col_2'])['Test_Value_y']]