python - 使用时间索引帧屏蔽 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_df
用mask_df
这样的方式进行掩饰,以便在任何时候有一个np.nan
in mask_df
this 都会变成一个np.nan
indata_df
执行此操作的最简洁的 pandas 方法是什么?
解决方案
这是我所做的:
仅使用时间插入新列:
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)
推荐阅读
- nestjs - 如何在 NestJS 中处理 BodyParser 错误(以及一般中间件错误)
- flutter - 从具有不健全的 null 安全性的 Flutter 项目运行 android 项目
- javascript - 修复用于渲染 Mui 的条件状态行为
- magento - Magento 2,波尔图主题中未显示类别图标图像
- r - 从R中的flextable中的超链接单元格中删除下划线
- swiftui - 如何在 macOS 上使用 SwiftUI 隐藏视频播放器上的按钮?
- html - 基于下拉值的显示元素
- typescript - 如何解决:'string'不能用于索引类型
- javascript - 未捕获的类型错误:无法将属性“innerHTML”设置为 null - Web 应用程序帮助
- java - Intellij 版权速度模板 - 如何添加文件创建日期