Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 基于其他数据帧中的列插入新列_Python 3.x_Pandas - Fatal编程技术网

Python 3.x 基于其他数据帧中的列插入新列

Python 3.x 基于其他数据帧中的列插入新列,python-3.x,pandas,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

我有两个数据帧,数据帧
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
---------------
我想基于
a
B
中创建一个新列

例如:对于表
B
中的第一行,如果存在一行
A2
等于
B2
A3
值是
B3
中的+-30,则它将在表
A
中进行检查,如果存在,则它将用
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)
---------------------
pandas
中有什么方法可以做到这一点吗?或者它是实现该结果的任何建议?

第一次需要外部连接、筛选、第一次重复和最后一次使用
map

注意-两个数据帧中的要求都是默认值
RangeIndex

如果值
A1
B1
是唯一的,则解决方案如下:

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

谢谢,改变了解决方案。
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