簡體   English   中英

pandas 非相等加入范圍

[英]pandas non equi join in range

當第一個表與范圍內的第二個表連接時,我需要執行“pandas non equi join”。

first_table

EMPLOYEE_ID SALARY
100     3000.00
101     17000.00
102     17000.00
103     9000.00
104     6000.00
105     4800.00
106     4800.00
…………..  …………
………………. …………

second_table
grade_id    lowest_sal  highest_sal grade_level
1   0       3500    GRADE-A
2   3501    7000    GRADE-B
3   7001    10000   GRADE-C
4   10000   20000   GRADE-D

Need_table(OUTPUT):
EMPLOYEE_ID SALARY  grade_level
115        3000         GRADE-A
116        17000        GRADE-D
117        17000        GRADE-D
118        9000         GRADE-C
119        6000         GRADE-B
125        4800         GRADE-B
126        4800         GRADE-B

這相當於 SQL 查詢為:

SELECT   f.EMPLOYEE_ID,
         f.SALARY,
         s.grade_level
FROM first_table f JOIN second_table s
ON f.SALARY BETWEEN s.lowest_sal AND s.highest_sal

無法使用“pd.merge”方法連接表,因為沒有任何公共列....請幫助查找方法

謝謝

如果df1是你的第一個表而df2是你的第二個表,你可以這樣做:

d = df2.set_index('grade_level').to_dict('split')

df1['GRADE'] = df1['SALARY'].apply(
        lambda x: next((c for i, c in enumerate(d['index']) if d['data'][i][1] <= x <= d['data'][i][2]), np.nan)
    )

print(df1)

印刷:

   EMPLOYEE_ID   SALARY    GRADE
0          100   3000.0  GRADE-A
1          101  17000.0  GRADE-D
2          102  17000.0  GRADE-D
3          103   9000.0  GRADE-C
4          104   6000.0  GRADE-B
5          105   4800.0  GRADE-B
6          106   4800.0  GRADE-B

一種選擇是使用pyjanitor中的conditional_join ,它避免了笛卡爾連接(有助於 memory 和性能,具體取決於數據大小):

# pip install pyjanitor
import pandas as pd
import janitor

(first_table
.astype({'SALARY':int})
.conditional_join(
    second_table, 
    ('SALARY', 'lowest_sal', '>='), 
    ('SALARY', 'highest_sal', '<='))
.loc[:, ['EMPLOYEE_ID', 'SALARY', 'grade_level']]
)
   EMPLOYEE_ID  SALARY grade_level
0          100    3000     GRADE-A
1          101   17000     GRADE-D
2          102   17000     GRADE-D
3          103    9000     GRADE-C
4          104    6000     GRADE-B
5          105    4800     GRADE-B
6          106    4800     GRADE-B

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM