提问人:123josh123 提问时间:11/14/2018 更新时间:1/5/2019 访问量:107
基于趋势值的数据操作
Data manipulation based on trends value
问:
给定一个包含“日期”列和“值”列的数据集,我需要提出根据“值”列中的趋势按日期分割数据的最佳解决方案。我的输出应该是一个包含以下列的 CSV 文件:StartDate、EndDate、StartValue、EndValue。“开始日期”和“结束日期”定义段的边界。 下面给出了一个简短的示例:输入数据:
**Date** **Value**
01/01/2014 10
01/02/2014 5
01/03/2014 5
01/04/2014 0
输出:
**StartDate** **EndDate** **StartValue** **EndValue**
01/01/2014 01/15/2014 10 5
01/16/2014 02/03/2014 5 5
02/04/2014 03/10/2014 5 4
答:
0赞
Chris
1/4/2019
#1
使用 (docs) 的方法。pandas.DataFrame.shift
首先,我将创建一个包含一些数据的 DataFrame:
import pandas as pd
datelist = pd.date_range('1/1/2019', periods=100).tolist()
values = np.random.randint(1, 5, 100)
df = pd.DataFrame({'Date': datelist, 'Value': values})
df = df.set_index('Date')
df.head(10)
Date Value
2019-01-01 1
2019-01-02 4
2019-01-03 2
2019-01-04 2
2019-01-05 2
2019-01-06 3
2019-01-07 2
2019-01-08 2
2019-01-09 3
2019-01-10 2
删除连续重复的行:
df = df.loc[df.Value.shift() != df.Value]
Date Value
2019-01-01 2
2019-01-02 1
2019-01-04 2
2019-01-05 3
2019-01-06 1
重置索引(如果该列是原始数据中的索引):Date
df = df.reset_index()
将现有列重命名为起始列。
df.columns = ['Start_Date', 'Start_Value']
通过将起始列向后移动一行来创建结束列。
df['End_Date'] = df.Start_Date.shift(-1)
df['End_Value'] = df.Start_Value.shift(-1)
删除 NaNs(由于 .shift(-1)
df = df.dropna()
将类型设置为(如果愿意)。End_Value
int
df['End_Value'] = df['End_Value'].astype(int)
df.head(10)
Start_Date Start_Value End_Date End_Value
0 2019-01-01 1 2019-01-02 4
1 2019-01-02 4 2019-01-03 2
2 2019-01-03 2 2019-01-06 3
3 2019-01-06 3 2019-01-07 2
4 2019-01-07 2 2019-01-09 3
5 2019-01-09 3 2019-01-10 2
6 2019-01-10 2 2019-01-11 1
7 2019-01-11 1 2019-01-12 2
8 2019-01-12 2 2019-01-15 1
9 2019-01-15 1 2019-01-16 4
从数据帧创建 CSV 文件:
df.to_csv('trends.csv')
评论