【问题标题】:For loop to identify a missing variable and create dummy rows in PythonFor 循环识别缺失变量并在 Python 中创建虚拟行
【发布时间】:2020-11-29 01:25:26
【问题描述】:

我有两列的数据框

  1. 车辆登记号
  2. KM 服务完成

有 25,000 多辆具有不同注册号的车辆。 这些车辆提供了从 10,000 公里到 800,000 公里不等的不同服务。

车辆 1 已使用服务 10,000 公里、20,000 公里、70,000 公里

[错过服务:30,000km、40,000km、50,000km、60,000km]

车辆2已使用服务210,000km,220,000km 230,000km,250,000km

[错过的服务:240,000 公里] 等等……

要求

用于识别特定车辆错过哪些服务的 For 循环 并创建一个虚拟行,其中包含注册号、km 服务和指定服务可用或服务缺失的第三列。

这是一个示例数据

注册号 KM 服务完成

HY12TN2345 10000

HY12TN2345 20000

HY12TN2345 70000

JO78UI4675 210000

JO78UI4675 220000

JO78UI4675 230000

JO78UI4675 250000

RT09EW0764 80000

RT09EW0764 90000

RT09EW0764 100000

RT09EW0764 110000

RT09EW0764 150000

RT09EW0764 160000

RT09EW0764 170000

RT09EW0764 180000

EQ21IT3040 410000

EQ21IT3040 510000

输出看起来像这样 Output

【问题讨论】:

    标签: pandas for-loop dummy-variable


    【解决方案1】:

    您可以在系列中使用reindex

    # get all possible values
    all_services = df['KMServiceDone'].unique()
    
    def reindex_grp(grp):
        s = grp.set_index('KMServiceDone')
        # add dummy rows for missing KMServiceDone
        s = s.reindex(all_services)
        return s.reset_index()
        
    # apply function on each group
    dfx = (df
          .groupby('RegistrationNumber', as_index=False)
          .apply(reindex_grp)
          .reset_index(drop=True))
    
    # create status column
    dfx['service_status'] = np.where(dfx['RegistrationNumber'].isna(),
                                     'Missed', 
                                     'Availed')
    
    print(dfx.head(20))
    
        KMServiceDone RegistrationNumber service_status
    0           10000                NaN         Missed
    1           20000                NaN         Missed
    2           70000                NaN         Missed
    3          210000                NaN         Missed
    4          220000                NaN         Missed
    5          230000                NaN         Missed
    6          250000                NaN         Missed
    7           80000                NaN         Missed
    8           90000                NaN         Missed
    9          100000                NaN         Missed
    10         110000                NaN         Missed
    11         150000                NaN         Missed
    12         160000                NaN         Missed
    13         170000                NaN         Missed
    14         180000                NaN         Missed
    15         410000         EQ21IT3040        Availed
    16         510000         EQ21IT3040        Availed
    17          10000         HY12TN2345        Availed
    18          20000         HY12TN2345        Availed
    19          70000         HY12TN2345        Availed
    

    【讨论】:

      【解决方案2】:

      使用重新索引和 np.arange

      df = (df.assign(Status="service_status")
      .set_index("KMServiceDone")
      .groupby("RegistrationNumber")["Status"]
      .apply(lambda d: d.reindex(np.arange(min(d.index), max(d.index)+delta, delta)))
      .reset_index()
      .fillna("Missed"))
      
      print (df)
      

      【讨论】:

        猜你喜欢
        • 2020-04-04
        • 2018-03-31
        • 2017-02-24
        • 2012-07-20
        • 2016-04-24
        • 1970-01-01
        • 2019-01-31
        • 2020-03-19
        • 1970-01-01
        相关资源
        最近更新 更多