python - 使用另一个数据帧的信息迭代数据帧

标签 python pandas iteration

我有一个问题,我认为更多的是关于逻辑而不是编码。我的目标是计算卡车装载和充电行驶了多少公里。

我有两个数据框

我们称第一个行程为:

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 表示发票

  1. 使用尽可能多的有效匹配两个数据帧的信息与 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'
    )
    

    enter image description here

  2. 使用 ffill() 填充 df3.Desitiny 中的 NULL 值

    df3['Destiny'] = df3.Destiny.ffill()
    
  3. 通过以下标志设置组标签:

    g = (~df3.Code.isnull() | (df3.shift().City == df3.Destiny)).cumsum()
    

    enter image description here

    注意:我在上图中添加了 df3['g'] 以供引用

  4. 根据上述组标签使用 ffill() 更新 df3.Code。

    df3['Code'] = df3.groupby(g).Code.ffill()
    

关于python - 使用另一个数据帧的信息迭代数据帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56012592/

相关文章:

python - 将行转换为一列的最有效方法

python - 如何获取从5号开始的前9个字符?

python - 如何将 Pandas 面板重新索引到 MultiIndex

python - 如何在Python中将函数应用于数据框中的所有列并以数据框的形式输出

python - 如何格式化 Twitter(和其他)时间戳?

python - PyQt_Fit : cannot import name path

python - 在 Python 中比较设备序列号

c++ - 循环条件下 rand() 的行为

python - 在 Python 3.6+ 中实现描述符的正确方法是什么?

python - python random.shuffle如何改变变量