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'] 的值的行?
非常感谢您的帮助
您可以使用 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
我基本上是复制了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
数据框中是否有条件"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'] 的值的行?
非常感谢您的帮助
您可以使用 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
我基本上是复制了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