python - 根据索引值删除特定列中的特定值
问题描述
我有下表,其中小时是索引:
Hour date plant1 plant2 plant3 ....
07:00:00 2019-06-23 22.1 22.8 21.4
07:03:00 2019-06-23 31.7 33.1 12.4
07:06:00 2019-06-23 11.1 12.5 11.4
07:09:00 2019-06-23 17.6 19.34 22.1
...
08:26:00 2019-06-23 11.1 12.5 11.4
08:40:00 2019-06-23 17.6 19.34 22.1
08:50:00 2019-06-23 11.1 12.5 11.4
08:59:00 2019-06-23 17.6 19.34 22.1
09:06:00 2019-06-23 11.1 12.5 11.4
09:09:00 2019-06-23 17.6 19.34 22.1
我想在 07:10 到 08:51 之间将植物 1 的值更改为空格或空值,因此它看起来像这样:
Hour date plant1 plant2 plant3 ....
07:00:00 2019-06-23 22.1 22.8 21.4
07:03:00 2019-06-23 31.7 33.1 12.4
07:06:00 2019-06-23 11.1 12.5 11.4
07:09:00 2019-06-23 17.6 19.34 22.1
...
08:26:00 2019-06-23 12.5 11.4
08:40:00 2019-06-23 19.34 22.1
08:50:00 2019-06-23 12.5 11.4
08:59:00 2019-06-23 17.6 19.34 22.1
09:06:00 2019-06-23 11.1 12.5 11.4
09:09:00 2019-06-23 17.6 19.34 22.1
我试图这样做:
df.loc['plant1'] = df.loc['plant1'].mask((df['Hour'].between(time(7,10,0),time(8,51,0)),''))
但是我得到了 plant1 的 keyerror (并且也不确定这是最好/正确的方法)。
我的最终目标:能够根据索引位置删除特定索引位置的特定列中的值。
澄清:我只需要小时作为索引(没有日期)
解决方案
如果可能,将小时和日期列转换为 datetimeindexDatetimeIndex.indexer_between_time
用于字符串形式的时间之间的索引,然后DataFrame.loc
使用索引设置列的值DatetimeIndex
:
df.index = pd.to_datetime(df['date']) + pd.to_timedelta(df.index.astype(str))
idx = df.index.indexer_between_time('07:10:00','08:51:00')
df.loc[df.index[idx], 'plant1'] = np.nan
print (df)
date plant1 plant2 plant3 ....
2019-06-23 07:00:00 2019-06-23 22.1 22.80 21.4 NaN
2019-06-23 07:03:00 2019-06-23 31.7 33.10 12.4 NaN
2019-06-23 07:06:00 2019-06-23 11.1 12.50 11.4 NaN
2019-06-23 07:09:00 2019-06-23 17.6 19.34 22.1 NaN
2019-06-23 08:26:00 2019-06-23 NaN 12.50 11.4 NaN
2019-06-23 08:40:00 2019-06-23 NaN 19.34 22.1 NaN
2019-06-23 08:50:00 2019-06-23 NaN 12.50 11.4 NaN
2019-06-23 08:59:00 2019-06-23 17.6 19.34 22.1 NaN
2019-06-23 09:06:00 2019-06-23 11.1 12.50 11.4 NaN
2019-06-23 09:09:00 2019-06-23 17.6 19.34 22.1 NaN
在您的解决方案中,是否Hour
使用索引index.to_series()
,因为Series.between
尚未使用DatetimeIndex
:
df['plant1'] = df['plant1'].mask((df.index.between(time(7,10,0),time(8,51,0))))
AttributeError:“索引”对象没有“之间”属性
df['plant1'] = df['plant1'].mask((df.index.to_series().between(time(7,10,0),time(8,51,0))))
print (df)
date plant1 plant2 plant3 ....
07:00:00 2019-06-23 22.1 22.80 21.4 NaN
07:03:00 2019-06-23 31.7 33.10 12.4 NaN
07:06:00 2019-06-23 11.1 12.50 11.4 NaN
07:09:00 2019-06-23 17.6 19.34 22.1 NaN
08:26:00 2019-06-23 NaN 12.50 11.4 NaN
08:40:00 2019-06-23 NaN 19.34 22.1 NaN
08:50:00 2019-06-23 NaN 12.50 11.4 NaN
08:59:00 2019-06-23 17.6 19.34 22.1 NaN
09:06:00 2019-06-23 11.1 12.50 11.4 NaN
09:09:00 2019-06-23 17.6 19.34 22.1 NaN
推荐阅读
- java - 错误原因:org/apache/commons/codec/binary/Base64
- sql - 选择未出现在其他表中的行
- minizinc - 在 minizinc 的输出语句中使用两次设置的 var 函数时遇到问题
- ios - swift navigationAction.navigationType linkactivated 未检测到相对 url
- javascript - 移位画笔画布
- oracle - 如何知道 Oracle 数据库中的统计信息是最新的?
- typescript - 如何收听来自套接字的消息并将它们打印到 TypeScript 中的控制台?
- c# - ASP.Net Core Web App - cshtml 文件无法调用控制器方法
- visual-studio-2019 - 有没有办法在 launchSettings.json 中使用构建变量?
- aws-lambda - Alexa.getRequestType 不是 AWS lambda Alexa 技能中的函数