首页 > 解决方案 > 熊猫按日期屏蔽特定列

问题描述

我有一个包含 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 列中的值这一事实有关,但我无法弄清楚它是什么。任何想法将不胜感激!

标签: pythonpandasdataframe

解决方案


最主要的是您需要将列值设置为等于应用的掩码: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)

推荐阅读