Pandas:使用iterrows()和pd.Series将值附加到Series

3

我的输入数据长这样:

   cat  start               target
0   1   2016-09-01 00:00:00 4.370279
1   1   2016-09-01 00:00:00 1.367778
2   1   2016-09-01 00:00:00 0.385834

我希望使用"start"表示开始日期,使用"target"表示系列值来构建一个系列。iterrows()可以正确地提取"imp"的值,但是当将其附加到time_series时,只有第一个值被传递到所有系列点。为什么"data=imp"每次都会提取第0行?

t0 = model_input_test['start'][0] # t0 = 2016-09-01 00:00:00
num_ts = len(model_input_test.index) # num_ts = 1348
time_series = []
for i, row in model_input_test.iterrows():
    imp = row.loc['target']
    print(imp)
    index = pd.DatetimeIndex(start=t0, freq='H', periods=num_ts)
    time_series.append(pd.Series(data=imp, index=index))

这里可以看到一个截图

时间序列系列“time_series”应该长这样:

2016-09-01 00:00:00    4.370279
2016-09-01 01:00:00    1.367778
2016-09-01 02:00:00    0.385834

但最终看起来像这样:

2016-09-01 00:00:00    4.370279
2016-09-01 01:00:00    4.370279
2016-09-01 02:00:00    4.370279

我正在Sagemaker上使用Jupyter conda_python3。

1
你正在使用变量“index”进行循环,然后创建一个“datetimeindex”,这似乎是个问题。 - Yuca
请注意:time_series不是pd.Series,而是pd.Series实例的list。编辑:您需要遍历行吗?您是否考虑过类似于pd.Series(data=model_input_test['target'], index=index)的东西? - Tomas Farias
2个回答

1
当使用数据框时,通常有比迭代数据框更好的方法来完成任务。例如,在您的情况下,您可以像这样创建您的系列:
time_series = (df.set_index(pd.date_range(pd.to_datetime(df.start).iloc[0],
                                        periods = len(df), freq='H')))['target']


>>> time_series
2016-09-01 00:00:00    4.370279
2016-09-01 01:00:00    1.367778
2016-09-01 02:00:00    0.385834
Freq: H, Name: target, dtype: float64
>>> type(time_series)
<class 'pandas.core.series.Series'>

基本上,这意味着:“将索引设置为从第一个日期开始每小时递增的日期范围,然后获取target列”。

1
谢谢Sacul - 很高效的解决方案! - mwhee

0
给定一个数据框 df 和系列 starttarget,您可以简单地使用 set_index
time_series = df.set_index('start')['target']

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接