【问题标题】:Concat dataframes in sequential manner以顺序方式连接数据帧
【发布时间】:2019-11-03 18:41:42
【问题描述】:

我有一个这样的数据框:

df1:

  start_date  end_date
0 20180101    20181231
1 20170101    20171231

另一个这样的数据框:

df2:

   Type    Value
0  House   100
1  Car     200
2  Bus     300
3  House   150 
4  Car     220  
5  Bus     320 

我需要将 df1 的第一个值(start_date 20180101 和 end_date 20181231)应用于第一轮 df2 类型,第二个应用于第二轮,依此类推(第一次出现“House”应该有 start_date 20180101 和 end_date 20181231;第二次“房子”出现它应该有 start_date 20170101 和 end_date 20171231 等等)。它应该是这样的:

df3:

   Type    Value  start_date  end_date
1  House   100    20180101    20181231
2  Car     200    20180101    20181231
3  Bus     300    20180101    20181231
4  House   150    20170101    20171231
5  Car     220    20170101    20171231
6  Bus     320    20170101    20171231

有什么想法吗?

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    首先我们在df2 中创建rounds 列,这表明House 再次出现时将进行单独的轮次。

    然后我们在df1 中为每一行创建一个rounds 列。

    最后我们mergerounds 列:

    df2['rounds'] = df2['Type'].eq('House').cumsum()
    df1['rounds'] = df1.index + 1
    
    df2 = df2.merge(df1, on='rounds', how='left').drop(columns='rounds')
    

    输出

        Type  Value  start_date  end_date
    0  House    100    20180101  20181231
    1    Car    200    20180101  20181231
    2    Bus    300    20180101  20181231
    3  House    150    20170101  20171231
    4    Car    220    20170101  20171231
    5    Bus    320    20170101  20171231
    

    注意

    我假设您的df1 index1 开头,如果它以0 开头,请删除+1

    【讨论】:

    • @Erlan 谢谢,工作得很好。但是显然您假设索引从 1 开始。如果它从 0 开始,我应该删除 +1。对吗?
    • 查看Note之后的最后一部分:@abutremutante
    • 是的,我就是这个意思。它显然是相反的。
    【解决方案2】:

    让我们使用cumcount

    df2.assign(index=df2.groupby('Type').cumcount()).\
          merge(df1.reset_index(),on='index').drop('index',1)
    Out[59]: 
        Type  Value  start_date  end_date
    0  House    100    20180101  20181231
    1    Car    200    20180101  20181231
    2    Bus    300    20180101  20181231
    3  House    150    20170101  20171231
    4    Car    220    20170101  20171231
    5    Bus    320    20170101  20171231
    

    【讨论】:

      猜你喜欢
      • 2018-11-23
      • 2019-12-11
      • 2011-07-28
      • 2021-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多