python - 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}")
但是,我需要做两件事:
- 获取指定日期的整数位置(即行号)
- 对选定的先前行执行统计功能。为简单起见,假设我想在“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'])
我该如何写这个 - 在这种情况下是否有可能(甚至有必要)使用矢量化?
解决方案
使用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
推荐阅读
- oauth-2.0 - 如何使用空手道发送带有 content-type:application/x-www-form-urlencoded 的 post 请求?
- java - java Spring Boot中用什么代替“System.out.println”
- html - svg 和路径之间的小空间
- java - 如何在android中创建自定义布局?
- sql - Oracle GROUP BY 子句有问题
- javascript - 如何使用监视方法来允许或不允许在 javascript 中将变量设置为 true 或 false
- java - 如何使用java将cron表达式转换为json格式
- python - 不能从两个列表中删除相似的元素
- javascript - Javascript OR 表达式:返回 *not* NaN 的操作数
- python - BigQuery 表从一个项目复制到另一个项目(这些使用另一个凭据)