我有一个数据帧(df),其中有2个主要列-一个称为“ 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列中的值,但我无法弄清楚它是什么。任何想法将不胜感激!
答案 0 :(得分:0)
最主要的是,您需要将列值设置为等于所应用的掩码: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)
答案 1 :(得分:0)
我想这就是你想要的。
df.TIMESTAMP = pd.to_datetime(df.TIMESTAMP)
dfNew.START = pd.to_datetime(dfNew.START, format='"%Y%m%d_%H%M"')
dfNew.END = pd.to_datetime(dfNew.END, format='"%Y%m%d_%H%M"')
def f(row):
df.loc[df['TIMESTAMP'].between(row[0], row[1]), 'QC'] = -1
dfNew.apply(f, axis=1)
答案 2 :(得分:0)