首页 > 解决方案 > 使用时间索引帧屏蔽 DatetimeIndex DataFrame

问题描述

假设我有以下数据DataFrame:

import pandas as pd
import numpy as np    
import datetime as dt  

index = pd.date_range(pd.Timestamp("2020/01/01 06:00:00"), pd.Timestamp("2020/10/20 20:00:00"), freq='8H')

n = len(index)

data_df = pd.DataFrame({'A': np.random.random(n), 'B': np.random.random(n), 'C': np.random.random(n)}, index=index)

然后假设我有以下掩码 DataFrame:

mask_df = pd.DataFrame({'A': [np.nan,1,1], 'B': [1,np.nan,np.nan], 'C': [1, np.nan, 1]}, index=[dt.time(6),dt.time(14),dt.time(20)])

我希望data_dfmask_df这样的方式进行掩饰,以便在任何时候有一个np.nanin mask_dfthis 都会变成一个np.nanindata_df

执行此操作的最简洁的 pandas 方法是什么?

标签: pythonpandasnumpydataframe

解决方案


这是我所做的:

仅使用时间插入新列:

data_df['time'] = data_df.index.time

然后根据掩码填充nan值:

for col in mask_df:
    nan_rows = [*mask_df.loc[mask_df[col].isna()].index]
    data_df.loc[data_df['time'].isin(nan_rows), col] = np.nan

data_df.head()

                    A           B           C           time
2020-01-01 06:00:00 NaN         0.022417    0.179227    06:00:00
2020-01-01 14:00:00 0.935356    NaN         NaN         14:00:00
2020-01-01 22:00:00 0.578508    0.170026    0.740205    22:00:00
2020-01-02 06:00:00 NaN         0.903510    0.801487    06:00:00
2020-01-02 14:00:00 0.720165    NaN         NaN         14:00:00

如果要删除“时间”列:

data_df.drop(columns = 'time', inplace = True)

推荐阅读