繁体   English   中英

从一个 dataframe 中查找值,并在新列中返回与另一个 dataframe 基于公共值的另一列中最接近的值

[英]Lookup value from one dataframe and return in a new column the closest value from another column in another dataframe based on a common value

听起来很吓人,但我会说清楚。

我有2个数据框:

df1

    Group   Target  Sales
0   A   13432   5756
1   A   13443   17083
2   A   13462   17635
3   A   13501   10266
4   A   13377   18375
5   A   13417   13963
6   A   13448   16056
11  B   13539   13020
12  B   13567   18171
13  B   14501   12135
14  B   13608   12399
15  B   13578   7419
16  B   13555   9083
21  C   13556   12121
22  C   13576   11633
23  C   13693   23983
24  C   12501   17222
25  C   13670   10547
26  C   13614   10945
27  C   13497   10411

df2

    Group   NewTarget
0   A   13500
1   B   14500
2   C   12500

常见的列是组。

我想进行各种查找,将 df2 中的“NewTarget”值与 df1 中的“Target”值进行比较,并将最接近的“Sales”值作为 df1 中的新列“New”按组返回。 所以结果看起来像这样:

df3

    Group   Target  Sales   New
0   A   13432   5756    10266
1   A   13443   17083   10266
2   A   13462   17635   10266
3   A   13501   10266   10266
4   A   13377   18375   10266
5   A   13417   13963   10266
6   A   13448   16056   10266
11  B   13539   13020   12135
12  B   13567   18171   12135
13  B   14501   12135   12135
14  B   13608   12399   12135
15  B   13578   7419    12135
16  B   13555   9083    12135
21  C   13556   12121   17222
22  C   13576   11633   17222
23  C   13693   23983   17222
24  C   12501   17222   17222
25  C   13670   10547   17222
26  C   13614   10945   17222
27  C   13497   10411   17222

注意我在 df1 中有许多其他数字列,但尽量保持简单。

感谢帮助。

提前谢谢了。

利用:

df = df1.merge(df2, on='Group', how='left')

df['NewTarget'] = (df.set_index('Sales')
               .assign(diff = lambda x: x['Target'].sub(x['NewTarget']).abs())
               .groupby('Group')['diff']
               .transform('idxmin')
               .to_numpy())
print (df)
   Group  Target  Sales  NewTarget
0      A   13432   5756      10266
1      A   13443  17083      10266
2      A   13462  17635      10266
3      A   13501  10266      10266
4      A   13377  18375      10266
5      A   13417  13963      10266
6      A   13448  16056      10266
7      B   13539  13020      12135
8      B   13567  18171      12135
9      B   14501  12135      12135
10     B   13608  12399      12135
11     B   13578   7419      12135
12     B   13555   9083      12135
13     C   13556  12121      17222
14     C   13576  11633      17222
15     C   13693  23983      17222
16     C   12501  17222      17222
17     C   13670  10547      17222
18     C   13614  10945      17222
19     C   13497  10411      17222

与熊猫merge_asof检查

out1 = pd.merge_asof(df2.sort_values('NewTarget'),
                     df1.sort_values('Target'),
                     left_on = 'NewTarget',
                     right_on='Target',
                     by='Group',
                     direction = 'nearest')
out = df1.merge(out1.loc[:,['Group','Sales']],on='Group')
Out[615]: 
   Group  Target  Sales_x  Sales_y
0      A   13432     5756    10266
1      A   13443    17083    10266
2      A   13462    17635    10266
3      A   13501    10266    10266
4      A   13377    18375    10266
5      A   13417    13963    10266
6      A   13448    16056    10266
7      B   13539    13020    12135
8      B   13567    18171    12135
9      B   14501    12135    12135
10     B   13608    12399    12135
11     B   13578     7419    12135
12     B   13555     9083    12135
13     C   13556    12121    17222
14     C   13576    11633    17222
15     C   13693    23983    17222
16     C   12501    17222    17222
17     C   13670    10547    17222
18     C   13614    10945    17222
19     C   13497    10411    17222

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM