【问题标题】:Pandas and Python Dataframes and Conditional Shift FunctionPandas 和 Python 数据框和条件移位函数
【发布时间】:2016-08-14 17:25:59
【问题描述】:

数据帧中是否有条件“移位”参数?

例如,

假设我拥有一辆二手车,并且我有如下数据

SaleDate    Car
12/1/2016   Wrangler
12/2/2016   Camry
12/3/2016   Wrangler
12/7/2016   Prius
12/10/2016  Prius
12/12/2016  Wrangler

我想从这个列表中找出两件事 -

1) 对于每次销售,最后一天售出汽车是什么时候?这在 Pandas 中很简单,只需简单转换如下

df['PriorSaleDate'] = df['SaleDate'].shift()

2) 对于每次销售,同一类型汽车的上一销售日期是什么时候?因此,例如,12/3 的 Wrangler 销售会将两行指向 12/1(最后一次第 3 行中的“car”值等于前一行中的“car”值)。

对于 12/12 出售的牧马人,我想要 12/3 的价值

是否有条件移位参数可以让我获得 df['Car'] 的值等于该行中 df['Car'] 的值的行?

非常感谢您的帮助

【问题讨论】:

    标签: python pandas data-analysis


    【解决方案1】:

    您可以使用groupbyshift()

    import io
    import pandas as pd
    
    text = """SaleDate    Car
    12/1/2016   Wrangler
    12/2/2016   Camry
    12/3/2016   Wrangler
    12/7/2016   Prius
    12/10/2016  Prius
    12/12/2016  Wrangler"""
    
    df = pd.read_csv(io.StringIO(text), delim_whitespace=True, parse_dates=[0])
    df["lastSaleDate"] = df.groupby("Car").SaleDate.shift()
    

    输出:

        SaleDate       Car lastSaleDate
    0 2016-12-01  Wrangler          NaT
    1 2016-12-02     Camry          NaT
    2 2016-12-03  Wrangler   2016-12-01
    3 2016-12-07     Prius          NaT
    4 2016-12-10     Prius   2016-12-07
    5 2016-12-12  Wrangler   2016-12-03
    

    【讨论】:

    • 我喜欢那个解决方案,但是有什么方法可以根据前一行保留最后的销售日期,或者我需要将其设为两步过程(groupby 与 shift 然后 df ['PriorSaleDate'] = df['SaleDate'].shift())?谢谢!
    • HYRY 的回答似乎完全符合您的要求。你只需要做两个任务。
    【解决方案2】:

    我基本上是在复制 HYRY 的答案并稍作修改。如果你喜欢这个解决方案。选择HYRY的答案作为你的答案。

    from StringIO import StringIO  # this is what I needed to do
    import pandas as pd
    
    text = """SaleDate    Car
    12/1/2016   Wrangler
    12/2/2016   Camry
    12/3/2016   Wrangler
    12/7/2016   Prius
    12/10/2016  Prius
    12/12/2016  Wrangler"""
    
    df = pd.read_csv(StringIO(text), delim_whitespace=True, parse_dates=[0])
    
    # what you already did
    df['PriorSaleDate'] = df['SaleDate'].shift()
    
    # what HYRY did
    df["CarSpecificPriorSaleDate"] = df.groupby("Car").SaleDate.shift()
    

    看起来像

    Out[34]:
        SaleDate       Car PriorSaleDate CarSpecificPriorSaleDate
    0 2016-12-01  Wrangler           NaT                      NaT
    1 2016-12-02     Camry    2016-12-01                      NaT
    2 2016-12-03  Wrangler    2016-12-02               2016-12-01
    3 2016-12-07     Prius    2016-12-03                      NaT
    4 2016-12-10     Prius    2016-12-07               2016-12-07
    5 2016-12-12  Wrangler    2016-12-10               2016-12-03
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-21
      • 1970-01-01
      • 1970-01-01
      • 2015-09-26
      • 1970-01-01
      • 2017-04-05
      • 2017-12-15
      • 2020-04-08
      相关资源
      最近更新 更多