我有两个数据框,数据框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
---------------
我想基于B
在A
中创建一个新列
示例:对于表B
的第一行,它将在表A
中检查是否存在A2
等于B2
和A3
的行值是{{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)
---------------------
中有什么方法可以做到这一点吗?还是有任何建议可以达到这个结果?
答案 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
值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