在索引数据框中创建额外列

2024-10-02 18:19:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前有一个带有三列的Datetime索引数据帧:

                     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       ...         ...    ...
     ...

我已经定义了一个函数,该函数创建了一个包含“glucosaa1”、“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

总而言之:

  • 如果您对如何改进此功能有任何意见,我将不胜感激,这样就不会花费太长时间。你知道吗
  • 一种更好的、更具Pythonic或pandas-y风格的方式来获取所需的数据帧是受欢迎的。我是新来的熊猫,我明白我的职能是一个完全幼稚的方法实现。你知道吗

Tags: 数据函数coredataframedfindextimeframe
1条回答
网友
1楼 · 发布于 2024-10-02 18:19:30

您可以通过.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

相关问题 更多 >