我有一个与语法相关的简单问题,但无法弄清楚。
我有两个数据框,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']]
答案 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']]