数据框中是否存在条件“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处的牧马人销售将指向两行返回到12/1(最后一次第3行中的“汽车”值等于前一行中的“汽车”值)。
对于12/12年出售的牧马人,我希望价值为12/3
是否有一个条件移位参数允许我在那里得到行df ['Car']等于该行中df ['Car']的值?
非常感谢你的帮助
答案 0 :(得分:9)
您可以使用groupby
和shift()
:
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
答案 1 :(得分: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