我有一个问题,我认为更多的是关于逻辑而不是编码。我的目标是计算卡车装载和充电行驶了多少公里。
我有两个数据框
我们称第一个行程为:
Date Licence City State KM
01/05/2019 AAA-1111 Sao Paulo SP 10
02/05/2019 AAA-1111 Santos SP 10
03/05/2019 AAA-1111 Rio de Janeiro RJ 20
04/05/2019 AAA-1111 Sao Paulo SP 15
01/05/2019 AAA-2222 Curitiba PR 20
02/05/2019 AAA-2222 Sao Paulo SP 25
我们来调用第二张发票
Code Date License Origin State Destiny UF Value
A1 01/05/2019 AAA-1111 Sao Paulo SP Rio de Janeiro RJ 10.000,00
A2 01/05/2019 AAA-2222 Curitiba PR Sao Paulo SP 15.000,00
我需要得到的是:
Date Licence City State KM Code
01/05/2019 AAA-1111 Sao Paulo SP 10 A1
02/05/2019 AAA-1111 Santos SP 10 A1
03/05/2019 AAA-1111 Rio de Janeiro RJ 20 A1
04/05/2019 AAA-1111 Sao Paulo SP 15 Nan
01/05/2019 AAA-2222 Curitiba PR 20 A2
02/05/2019 AAA-2222 Sao Paulo SP 25 A2
正如我所说,这更多的是一个逻辑问题。卡车在圣保罗的起始地点装货。如果我没有 cargo 交付的日期,如何迭代行知道 cargo 经过桑托斯装载,然后前往里约热内卢?
谢谢
最佳答案
假设第一个数据帧(df1)中的行已排序,这就是我要做的:
注意:下面我使用 df1
表示行程,使用 df2
表示发票
使用尽可能多的有效匹配两个数据帧的信息与 df1(左)和 df2(右)进行左连接,以便我们可以在 df1 中找到起源的行的旅行。在我的测试中,我使用的字段:['Date', 'License', 'City', 'State'],将结果保存在新的数据帧
df3
中df3 = df1.merge(df2[df2.columns[:6]].rename(columns={'Origin':'City'}) , on = ['Date', 'License', 'City', 'State'] , how = 'left' )
使用
ffill() 填充 df3.Desitiny 中的 NULL 值
df3['Destiny'] = df3.Destiny.ffill()
通过以下标志设置组标签:
g = (~df3.Code.isnull() | (df3.shift().City == df3.Destiny)).cumsum()
注意:我在上图中添加了 df3['g'] 以供引用
根据上述组标签使用 ffill() 更新 df3.Code。
df3['Code'] = df3.groupby(g).Code.ffill()
关于python - 使用另一个数据帧的信息迭代数据帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56012592/