相当于Pandas数据框中的SQL查询

时间:2019-07-04 03:32:32

标签: python sql pandas dataframe

我有两个表1.Table_A 2.Table_B我想使用table_B对该列的新值来更新table_A特定列,这可能是因为Table_A中的行数与Table_B不匹配。 我知道如何使用SQL编写查询以更新Table_A,但不确定如何在熊猫中做到这一点,我需要在熊猫中使用等效的更新查询

更新查询:

update table_A
    set dt_of_join = sq.dt_of_join
    from (select id_emp, max(joining) as dt_of_join
            from table_B 
            group by id_emp ) as sq
    where table_A.id_emp = sq.id_emp

我需要在Pandas Dataframe中实现上述查询的等同功能,对您的帮助非常感谢。

示例:

Table_A
id_emp    |   dt_of_join     
  2       |   30-03-2018
  4       |   03-04-2018
  5       |   04-05-2018
  7       |   10-06-2018
  12      |   20-07-2018
  10      |   09-08-2018
  19      |   25-12-2018

表B是上述查询中的子查询

Table_B
 id_emp   |   dt_of_join
   4      |    01-01-2019
   12     |    03-02-2019
   10     |    09-05-2019
   5      |    21-06-2019

更新查询成功后,table_A应该看起来像这样

Table_A
id_emp    |   dt_of_join     
  2       |   30-03-2018
  4       |   01-01-2019
  5       |   21-06-2019
  7       |   10-06-2018
  12      |   03-02-2019
  10      |   09-05-2019
  19      |   25-12-2018

3 个答案:

答案 0 :(得分:1)

为什么不reindex

>>> df['dt_of_join'] = df2.set_index('id_emp').reindex(df['id_emp']).reset_index()['dt_of_join'].fillna(df['dt_of_join'])
>>> df
   id_emp  dt_of_join
0       2  30-03-2018
1       4  01-01-2019
2       5  21-06-2019
3       7  10-06-2018
4      12  03-02-2019
5      10  09-05-2019
6      19  25-12-2018
>>> 

答案 1 :(得分:1)

您可以将series.map()fillna()一起使用,这是单个col更新的更快选择(假设id_emp是一列,否则d应该是{{1 }}):

df2['dt_of_join']

d=df2.set_index('id_emp')['dt_of_join']
df1.dt_of_join=df1.id_emp.map(d).fillna(df1.dt_of_join)
print(df1)

答案 2 :(得分:0)

将{em> emp_id 设置为两者的索引后,请考虑DataFrame.update

final_df = (tbl1_df.set_index('id_emp')
                   .update(tbl2_df.set_index('id_emp'))
           )