首页 > 解决方案 > Pandas DataFrame - 如何在迭代 DataFrame 时对先前行的选择执行统计信息

问题描述

我不得不迭代一个日期时间索引的DataFrame(是的,我知道迭代在熊猫社区中被看不起)

我知道如何迭代 using iterrows(),但这似乎不允许我“回顾”到前几行。

这是我的代码:

data = [
['2018-04-25 18:37:00',       5862,        4427],
['2018-04-25 21:36:30',       6421,        4581],
['2018-04-25 22:13:00',       5948,        4779],
['2018-04-26 00:11:30',       5703,        4314],
['2018-04-26 02:27:00',       4988,        3868],
['2018-04-26 04:28:30',       4812,        3823],
['2018-04-26 06:22:30',       4347,        3672],
['2018-04-26 10:50:30',       3896,        3546],
['2018-04-26 12:04:30',       3478,        3557],
['2018-04-26 14:02:30',       3625,        3598],
['2018-04-26 15:31:30',       3751,        3606]
]

df = pd.DataFrame(data, columns=['datetime', 'discharge1', 'discharge2'])
df['datetime'] = df['datetime'].apply(pd.to_datetime)
df = df.set_index('datetime')

then iterate over index, and values:

for i, v in df.iterrows():
    print(f"{i},{v}")

但是,我需要做两件事:

  1. 获取指定日期的整数位置(即行号)
  2. 对选定的先前行执行统计功能。为简单起见,假设我想在“A”列的前 5 行值中找到 MAX 值因为我遍历行。

我想做的是这样的(伪代码):

start_datetime='2018-04-26 00:11:30'
start_pos = df.get_index_position_for_datetime(start_datetime)

for i in range(start_pos, len(df)):
    value = df.iloc[i,'discharge1'] - get_average_over(df.iloc[i,'discharge2']:df.iloc[i-5,'discharge2'])

我该如何写这个 - 在这种情况下是否有可能(甚至有必要)使用矢量化?

标签: pythonpandasdataframe

解决方案


使用DataFrame.rolling并应用均值:

N = 5

df['value'] = df['discharge1'] - df['discharge2'].rolling(N).mean()

location = df.index.get_loc(start_datetime)
df.loc[df.index > start_datetime, 'value'] = np.nan

推荐阅读