如果值使用pandas落在另一个数据框的范围内,则从另一个数据框添加列

时间:2019-02-04 14:06:42

标签: python pandas dataframe

我有一个像这样的数据框:

df1
col1     col2      col3
  A       11        RS
  B       23        PN
  A       24        LR
  C       23        TN
  D       1         WB
  C       23        PR

另一个数据框:

df2
name     min     max   points
 A        1      15       1
 A        15     30       2
 B        1      15       1
 B        15     30       2
 C        1      15       1
 C        15     30       2
 D        1      15       1
 D        15     30       2

如果df1的col2值低于df2的最大值和最小值,我想将点值从df2放到df1

我要查找的数据框

df3
col1     col2      col3     points
  A       11        RS         1
  B       23        PN         2
  A       24        LR         2
  C       23        TN         2
  D       1         WB         1
  C       23        PR         2

如何使用熊猫最有效地做到这一点

1 个答案:

答案 0 :(得分:1)

首先使用merge,然后使用boolean indexingbetween进行过滤:

df = df1.merge(df2, left_on='col1', right_on='name')
df = df[df['col2'].between(df['min'], df['max'])].drop(['name','min','max'], axis=1)
print (df)
   col1  col2 col3  points
0     A    11   RS       1
3     A    24   LR       2
5     B    23   PN       2
7     C    23   TN       2
9     C    23   PR       2
10    D     1   WB       1

添加列points的解决方案:

df = df1.reset_index().merge(df2, left_on='col1', right_on='name')
df = df.loc[df['col2'].between(df['min'], df['max']),['index','points']]
print (df)
    index  points
0       0       1
3       2       2
5       1       2
7       3       2
9       5       2
10      4       1

df1['points'] = df.set_index('index')['points']
print (df1)
  col1  col2 col3  points
0    A    11   RS       1
1    B    23   PN       2
2    A    24   LR       2
3    C    23   TN       2
4    D     1   WB       1
5    C    23   PR       2