Pandas 和 Python 数据帧和条件移位函数

Pandas and Python Dataframes and Conditional Shift Function

数据框中是否有条件"shift"参数?

例如,

假设我有一个二手车场并且我有如下数据

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'] 的值的行?

非常感谢您的帮助

您可以使用 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

我基本上是复制了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