【问题标题】:Updating value of one column in dataframe if ID match found in column of another dataframe如果在另一个数据框的列中找到 ID 匹配,则更新数据框中一列的值
【发布时间】:2020-05-26 21:11:00
【问题描述】:

我有两个数据框。第二个数据帧是从第一个数据帧派生的。我更新了第二个数据框中的一列,然后我想将更新后的值放回第一个数据框中。我试过“合并”,但它给了我两列后缀“_x”和“_y”

import pandas

lotQtyQueryForDF = pandas.read_sql_query(refreshQuery,conForInfo)
dataFrameOfLots = pandas.DataFrame(lotQtyQueryForDF,columns=['Customer','Stage','ProdType','Brand','ProdName','Size','Strength','Lot','PackedOn','Qty','Available'])

dataFrameOfLots['Available']=dataFrameOfLots["Available"].fillna(dataFrameOfLots['Qty'])
#inserting columns
dataFrameOfLots['QtyInTransaction']=0   
dataFrameOfLots['IndexCol'] = range(1, len(dataFrameOfLots) + 1)

dataFrameFiltered=dataFrameOfLots.query('Brand=="XYZ" & Customer=="ABC"')
dataFrameFiltered.loc[:,'Qty in transaction']=34
dataFrameFiltered2=dataFrameFiltered[['Qty in transaction','IndexCol']].copy()
dataFrameOfLots.merge(dataFrameFiltered2,on='IndexCol',how='outer')

输入数据集:

Customer Stage ProdType Brand ProdName Size Strength Lot PackedOn Qty Available

DEF      A       Bulk    YYY   Test    Test   Weak    1   20200101 10    5            

ABC      A       Bulk    XYZ   Test    Test   Weak    1   20200101 10    5            

GHI      A       Bulk    YTY   Test    Test   Weak    1   20200101 10    5            

ABC      B       RAW     XYZ   Test    Test   Weak    1   20200101 10    5            

实际输出:

Customer Stage ProdType Brand ProdName Size Strength Lot PackedOn Qty Available QtyInTransaction_x IndexCol QtyInTransaction_y

DEF      A       Bulk    YYY   Test    Test   Weak    1   20200101 10    5            0               1             0 

ABC      A       Bulk    XYZ   Test    Test   Weak    1   20200101 10    5            0               2             34 

GHI      A       Bulk    YTY   Test    Test   Weak    1   20200101 10    5            0               3             0 

ABC      B       RAW     XYZ   Test    Test   Weak    1   20200101 10    5            0               4             34

预期输出:

Customer Stage ProdType Brand ProdName Size Strength Lot PackedOn Qty Available IndexCol QtyInTransaction

DEF      A       Bulk    YYY   Test    Test   Weak    1   20200101 10    5           1             0 

ABC      A       Bulk    XYZ   Test    Test   Weak    1   20200101 10    5           2             34 

GHI      A       Bulk    YTY   Test    Test   Weak    1   20200101 10    5           3             0 

ABC      B       RAW     XYZ   Test    Test   Weak    1   20200101 10    5           4             34

查询是正确的方法吗? 我将如何合并以便只显示一列?

谢谢

【问题讨论】:

  • 能否请您提供输入数据集。只有一个 sql 查询,我们无法读取您的数据库
  • 添加了输入数据集

标签: python pandas dataframe join merge


【解决方案1】:

请在执行过滤器后尝试使用外部合并并删除不需要的行。代码如下。

result=pd.merge(dataFrameOfLots, dataFrameFiltered, how='outer', on=['Customer', 'Stage', 'ProdType', 'Brand', 'ProdName', 'Size',
       'Strength', 'Lot', 'PackedOn', 'Qty', 'Available'],suffixes=('_x', '')).fillna(0)
result=result.loc[:,~result.columns.str.endswith('_x')]#drop unwanted columns

result.drop(columns=['QtyInTransaction_x','IndexCol_x'], inplace=True)#drop unwanted columns

【讨论】:

  • 谢谢,虽然这行:result.loc[:,~result.columns.str.endswith('_x')] 似乎没有影响。
  • 这正是我所缺少的。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多