【问题标题】:Pandas DataFrame Change Values Based on Values in Different RowsPandas DataFrame 根据不同行中的值更改值
【发布时间】:2021-10-06 10:55:57
【问题描述】:

我有一个数据框,其中包含 1115 家商店的商店销售数据,日期超过 2.5 年。 StateHoliday 列是一个分类变量,指示它的假期类型。请参阅下面的 df 部分。可以看出,b 是复活节的代码。其他节日还有其他代码。

Piece of DF

我的目标是分析假期前后的销售情况。我寻求这样做的方法是将 StateHoliday 列的值更改为特定假期前几天的独特值。例如,b 是复活节的代码,所以我可以将值更改为 b- 表示这一天是复活节前不久。我能想到的唯一方法是通过并手动更改某些日期的这些值。假期不多,所以做起来也不难。但是还是很烦!

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    Tom,看看这是否适合您,如果不适合,请提供更多信息: 在文件中我有以下数据:

    Store,Sales,Date,StateHoliday
    1,6729,2013-03-25,0
    1,6686,2013-03-26,0
    1,6660,2013-03-27,0
    1,7285,2013-03-28,0
    1,6729,2013-03-29,b
    1115,10712,2015-07-01,0
    1115,11110,2015-07-02,0
    1115,10500,2015-07-03,0
    1115,12000,2015-07-04,c
    
    import pandas as pd
    
    fname = r"D:\workspace\projects\misc\data\holiday_sales.csv"
    df = pd.read_csv(fname)
    
    df["Date"] = pd.to_datetime(df["Date"])
    
    holidays = df[df["StateHoliday"]!="0"].copy(deep=True) # taking only holidays
    dictDate2Holiday = dict(zip(holidays["Date"].tolist(), holidays["StateHoliday"].tolist()))
    
    look_back = 2 # how many days back you want to go
    holiday_look_back = []
    # building a list of pairs (prev days, holiday code)
    for dt, h in dictDate2Holiday.items():
        prev = dt
        holiday_look_back.append((prev, h))
        for i in range(1, look_back+1):
            prev = prev - pd.Timedelta(days=1)
            holiday_look_back.append((prev, h))
    
    dfHolidayLookBack = pd.DataFrame(holiday_look_back, columns=["Date", "StateHolidayNew"])
    
    df = df.merge(dfHolidayLookBack, how="left", on="Date")
    df["StateHolidayNew"].fillna("0", inplace=True)
    print(df)
    

    StateHolidayNew 列应该包含您开始分析数据所需的信息

    【讨论】:

      【解决方案2】:

      假设你有一个这样的数据框:

          Store  Sales       Date StateHoliday
      0       2   4205 2016-11-15            0
      1       1    684 2016-07-13            0
      2       2   8946 2017-04-15            0
      3       1   6929 2017-02-02            0
      4       2   8296 2017-10-30            b
      5       1   8261 2015-10-05            0
      6       2   3904 2016-08-22            0
      7       1   2613 2017-12-30            0
      8       2   1324 2016-08-23            0
      9       1   6961 2015-11-11            0
      10      2     15 2016-12-06            a
      11      1   9107 2016-07-05            0
      12      2   1138 2015-03-29            0
      13      1   7590 2015-06-24            0
      14      2   5172 2017-04-29            0
      15      1    660 2016-06-21            0
      16      2   2539 2017-04-25            0
      

      您可以做的是将代表假期的不同字母之间的值分组,然后 groupby 以根据每个组找出销售额。对此的改进是在组之前回填数字,例如,groups=0.0 将变为b_0,这将更容易理解组以及它们代表的假期,但我不知道该怎么做。

      df['StateHolidayBool'] = df['StateHoliday'].str.isalpha().fillna(False).replace({False: 0, True: 1})
      df = df.assign(group = (df[~df['StateHolidayBool'].between(1,1)].index.to_series().diff() > 1).cumsum())
      df = df.assign(groups = np.where(df.group.notna(), df.group, df.StateHoliday)).drop(['StateHolidayBool', 'group'], axis=1)
      df[~df['groups'].str.isalpha().fillna(False)].groupby('groups').sum()
      

      输出:

              Store  Sales
      groups              
      0.0         6  20764
      1.0         7  23063
      2.0         9  26206
      

      最终数据帧:

          Store  Sales       Date StateHoliday groups
      0       2   4205 2016-11-15            0    0.0
      1       1    684 2016-07-13            0    0.0
      2       2   8946 2017-04-15            0    0.0
      3       1   6929 2017-02-02            0    0.0
      4       2   8296 2017-10-30            b      b
      5       1   8261 2015-10-05            0    1.0
      6       2   3904 2016-08-22            0    1.0
      7       1   2613 2017-12-30            0    1.0
      8       2   1324 2016-08-23            0    1.0
      9       1   6961 2015-11-11            0    1.0
      10      2     15 2016-12-06            a      a
      11      1   9107 2016-07-05            0    2.0
      12      2   1138 2015-03-29            0    2.0
      13      1   7590 2015-06-24            0    2.0
      14      2   5172 2017-04-29            0    2.0
      15      1    660 2016-06-21            0    2.0
      16      2   2539 2017-04-25            0    2.0
      

      【讨论】:

        猜你喜欢
        • 2012-10-15
        • 2019-04-06
        • 2019-05-08
        • 2017-03-10
        • 2021-08-12
        • 2013-08-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多