根据其他数据框熊猫中的列插入新列

时间:2019-01-24 08:06:41

标签: python-3.x pandas

我有两个数据框,数据框A

---------------
A1    A2    A3   
1     aa    101        
2     bb    130
3     aa    160
4     cc    190
5     aa    200
---------------

数据帧B

---------------
B1    B2    B3   
1     aa    111        
2     aa    171
3     bb    131
4     aa    131
5     cc    300
---------------

我想基于BA中创建一个新列

示例:对于表B的第一行,它将在表A中检查是否存在A2等于B2A3的行值是{{1}的+-30,如果有,它将用B3的值填充为A1,其最终结果是

B4

--------------------- B1 B2 B3 B4 1 aa 111 1 2 aa 171 3 (3 or 5, but it will chose first value, so it is 3) 3 bb 131 2 4 aa 131 1 (1 or 3, but it will chose first value, so it is 1) 5 cc 300 NaN (no conditions fulfilled) --------------------- 中有什么方法可以做到这一点吗?还是有任何建议可以达到这个结果?

1 个答案:

答案 0 :(得分:1)

首先需要merge进行外部联接,对between进行过滤,对sort_values进行drop_duplicates的过滤,最后一次使用map进行过滤,

通知-两个数据帧中的需求默认为RangeIndex

df = df2.reset_index().merge(df1.reset_index(), left_on='B2', right_on='A2', how='outer')
df = df[df['B3'].between(df['A3'] - 30, df['A3'] + 30)]

df = df.sort_values('index_y').drop_duplicates('index_x')
print (df)
   index_x  B1  B2   B3  index_y  A1  A2   A3
0        0   1  aa  111        0   1  aa  101
6        3   4  aa  131        0   1  aa  101
9        2   3  bb  131        1   2  bb  130
4        1   2  aa  171        2   3  aa  160


df2['B4'] = df2.index.to_series().map(df.set_index('index_x')['A1'])
print (df2)
   B1  B2   B3   B4
0   1  aa  111  1.0
1   2  aa  171  3.0
2   3  bb  131  2.0
3   4  aa  131  1.0
4   5  cc  300  NaN

A1B1唯一的解决方案:

df = df2.merge(df1, left_on='B2', right_on='A2', how='outer')
df = df[df['B3'].between(df['A3'] - 30, df['A3'] + 30)]
df = df.sort_values('A1').drop_duplicates('B1')
df2['B4'] = df2['B1'].map(df.set_index('B1')['A1'])
print (df2)
   B1  B2   B3   B4
0   1  aa  111  1.0
1   2  aa  171  3.0
2   3  bb  131  2.0
3   4  aa  131  1.0
4   5  cc  300  NaN