熊猫按日期屏蔽特定列

时间:2020-05-29 08:00:32

标签: python pandas dataframe

我有一个数据帧(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列中的值,但我无法弄清楚它是什么。任何想法将不胜感激!

3 个答案:

答案 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)

布尔选择

m=df.QC==1

使用.loc访问器

df.loc[m,'QC']=-1

enter image description here