python - 熊猫按日期屏蔽特定列
问题描述
我有一个包含 2 个主要列的数据框(df)——一个称为“TIMESTAMP”表示日期,一个称为“QC”,将质量控制标志反映为整数。这个 df 有大约 40,000 行,所以我不想遍历每一行。
我有一个新的数据框(dfNew),只有两列有几个开始和结束日期对。我想通过我的原始 df 并且对于 TIMESTAMP 位于 dfNew 中列出的任何开始-结束日期对之间的所有行,我想用 -1 替换 QC 值。这个 dfNew 有大约 400 行,所以我认为在这里迭代不会太糟糕。
df 看起来像这样:
TIMESTAMP | QC
2019-05-04 00:22 5
2019-05-04 00:24 1
2019-05-09 03:30 3
dfNew 看起来像这样:
START | END
20190504_0023 20190504_0024
所以我想用 QC=-1 替换 df 中第二行的 QC=1。
到目前为止,这是我的代码:
for index, row in dfNew.iterrows():
df['TIMESTAMP'] = pd.to_datetime(df['TIMESTAMP'])
start = datetime.datetime.strptime(row[0], "%Y%m%d_%H%M")
end = datetime.datetime.strptime(row[1], "%Y%m%d_%H%M")
masked = (df['TIMESTAMP'] >= start) & (df['TIMESTAMP'] <= end)
df['QC'].mask(masked, -1)
但是由于某种原因,面具不起作用。没有值被 -1 替换。我认为这可能与我正在使用 TIMESTAMP 列创建掩码但尝试使用该掩码替换 QC 列中的值这一事实有关,但我无法弄清楚它是什么。任何想法将不胜感激!
解决方案
最主要的是您需要将列值设置为等于应用的掩码:df['QC'] = df['QC'].mask(masked, -1)
。
您只需在循环之外将“TIMESTAMP”列转换为日期时间。假设您在 dfNew 中有多行,则每行的开始时间和结束时间都会发生变化,因此它会保留在循环内。
# this should be outside of the loop
df['TIMESTAMP'] = pd.to_datetime(df['TIMESTAMP'])
for index, row in dfNew.iterrows():
start = datetime.datetime.strptime(row[0], "%Y%m%d_%H%M")
end = datetime.datetime.strptime(row[1], "%Y%m%d_%H%M")
masked = (df['TIMESTAMP'] >= start) & (df['TIMESTAMP'] <= end)
df['QC'] = df['QC'].mask(masked, -1)
推荐阅读
- python - 覆盖 Wagtail 删除确认消息
- html - VBA web Scraping - 将 HTMLdoc 转换为 XML,但在单击按钮时遇到错误
- python - 乌龟根本不会在这段代码中移动
- ruby - 根据条件为哈希参数赋值
- python - TypeError: unhashable type: 'list' 用于比较 pandas 列
- powershell - 使用 Powershell 计算特定层中仅子文件夹的总数
- java - Android Room Database:如何在 DAO @Query 中正确选择“tableName”?
- reactjs - React:在功能组件中获取后更改状态
- python - 在值之间添加行完全阶乘和插值
- microsoft-graph-api - 检索在 ms 图中给出 403 错误的线程和帖子