gpt4 book ai didi

pandas - 将每日数据的宽 Pandas 数据框按周转换为每日数据的长数据框

转载 作者:行者123 更新时间:2023-12-02 00:52:43 24 4
gpt4 key购买 nike

我正在使用 pandas 数据框,其中每一行都包含一周的开始日期以及该周的每日数据。例如:

    start_date  mon  tue  wed   thu   fri   sat  sun
2017-01-01 10 15 8 19 20 21 4

我想做时间序列分析,需要以下格式的数据:

    date         amount
2017-01-01 10
2017-01-02 15
2017-01-03 8
2017-01-04 19
2017-01-05 20
2017-01-06 21
2017-01-07 4

我相信我可以使用 pandas melt 将数据集从宽数据集转换为长数据集,但我正在努力解决如何最好地填写日期。

我尝试了以下方法,但它似乎是一种解决方法:

df = pd.DataFrame({'start_date': {0: '2017-01-01'}, 'mon': {0: 10},
'tue': {0: 15}, 'wed': {0: 8}, 'thu': {0: '19'},
'fri': {0: 20}, 'sat': {0: 21}, 'sun': {0: 4}})

df = df.melt(id_vars='start_date', value_name="amount")

day_add = {'mon': 0,
'tue': 1,
'wed': 2,
'thu': 3,
'fri': 4,
'sat': 5,
'sun': 6,
}

df = df.replace({"variable": day_add})

df['date'] = pd.to_datetime(df['start_date'], infer_datetime_format=True) +
pd.to_timedelta(df['variable'], unit='d')

print(df[['date', 'amount']].sort_values(by=['date']))

当前代码的结果:

        date amount
1 2017-01-01 10
5 2017-01-02 15
6 2017-01-03 8
4 2017-01-04 19
0 2017-01-05 20
2 2017-01-06 21
3 2017-01-07 4

欢迎使用其他方法。

最佳答案

您的解决方案非常好。我唯一要更改(可能)的是将 replace 调用替换为快速(er)map 调用,您可以在线执行该调用。

为了完整起见,这里有一个使用 stack 的类似解决方案。这几乎与使用 melt 相同。我还在此处展示了如何使用 map:

u = df.set_index('start_date').stack()
u.index = (
pd.to_datetime(u.index.get_level_values(0))
+ pd.to_timedelta(u.index.get_level_values(1).map(day_add), unit='d'))

u.rename_axis('date').reset_index(name='amount')

date amount
0 2017-01-01 10
1 2017-01-02 15
2 2017-01-03 8
3 2017-01-04 19
4 2017-01-05 20
5 2017-01-06 21
6 2017-01-07 4

关于pandas - 将每日数据的宽 Pandas 数据框按周转换为每日数据的长数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56318970/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com