我当前有一个包含三列的Datetime-Indexed数据框:
Glucosa Insulina Carbs
Hour
2018-05-16 06:43:00 156.0 7.0 65.0
2018-05-16 07:43:00 170.0 0.0 65.0
2018-05-16 08:45:00 185.0 2.0 0.0
2018-05-16 09:45:00 150.0 0.0 0.0
2018-05-16 10:45:00 80.0 0.0 0.0
...
我想创建三个额外的列,这些列保存从当前索引开始一小时索引的值,最终得到如下结果:
Glucosa Insulina Carbs Glucosa1 Insulina1 Carbs1
Hour
2018-05-16 06:43:00 156.0 7.0 65.0 170.0 0.0 65.0
2018-05-16 07:43:00 170.0 0.0 65.0 185.0 2.0 0.0
2018-05-16 08:45:00 185.0 2.0 0.0 150.0 0.0 0.0
2018-05-16 09:45:00 150.0 0.0 0.0 80.0 0.0 0.0
2018-05-16 10:45:00 80.0 0.0 0.0 ... ... ...
...
我已经定义了一个函数,它创建了一个包含'Glucosa1','Insulina1','Carbs1'列的数据框,但它的性能非常差,我想让它运行得更快。
我使用以下内容分析不同函数在我的代码上使用的时间:
start = time.time()
# foo()
end = time.time()
print(f' Time required to execute foo() : {end - start}')
对于函数nn_format_df(),与类似函数(迭代数据帧的行)相比,输出的时间为8.331165秒(平均),输出为0.366158秒。
在创建一个新的数据帧后,在原始文件上调用我的函数,我合并它们以获得所需的数据帧。
df2 = nn_format_df(df)
df = df.join([df2])
功能:
def nn_format_df( df : pd.core.frame.DataFrame ) -> pd.core.frame.DataFrame:
_indices : pd.core.indexes.datetimes.DatetimeIndex = [ idx for idx in df.index ]
indices = _indices[:-60]
_df : pd.core.frame.DataFrame = df.copy()
_df1 : pd.core.frame.DataFrame
_glc1 : pd.core.series.Series = pd.Series(pd.np.nan, index=_indices)
_insu1 : pd.core.series.Series = pd.Series(pd.np.nan, index=_indices)
_carbs1 : pd.core.series.Series = pd.Series(pd.np.nan, index=_indices)
aux : pd._libs.tslibs.timestamps.Timestamp
aux1 : pd._libs.tslibs.timestamps.Timestamp
one : datetime.timedelta = datetime.timedelta(hours=1)
for idx in indices:
aux = _df.ix[ idx, : ].name
aux1 = aux + one
_glc1[ idx ] = _df.ix[ aux1, 'Glucosa' ]
_insu1[ idx ] = _df.ix[ aux1, 'Insulina' ]
_carbs1[ idx ] = _df.ix[ aux1, 'Carbs' ]
_df1 = pd.DataFrame({ 'Glucosa1': _glc1,\
'Insulina1': _insu1,\
'Carbs1': _carbs1
}, index=_indices)
return _df1
总结一下:
答案 0 :(得分:3)
您可以使用.shift
快速完成此操作,这会移动整个DataFrame
。只需使用pd.concat
将它们组合在一起; axis=1
参数指定要追加新列而不是行。
import pandas as pd
pd.concat([df, df.shift(-1).rename(columns=dict((elem, elem+'1') for elem in df.columns))], axis=1)
上面的代码为您提供了以下输出:
Glucosa Insulina Carbs Glucosa1 Insulina1 Carbs1
Hour
2018-05-16 06:43:00 156.0 7.0 65.0 170.0 0.0 65.0
2018-05-16 07:43:00 170.0 0.0 65.0 185.0 2.0 0.0
2018-05-16 08:45:00 185.0 2.0 0.0 150.0 0.0 0.0
2018-05-16 09:45:00 150.0 0.0 0.0 80.0 0.0 0.0
2018-05-16 10:45:00 80.0 0.0 0.0 NaN NaN NaN