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