首页 > 解决方案 > 根据索引值删除特定列中的特定值

问题描述

我有下表,其中小时是索引

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 (并且也不确定这是最好/正确的方法)。

我的最终目标:能够根据索引位置删除特定索引位置的特定列中的值。

澄清:我只需要小时作为索引(没有日期)

标签: pythonpandasindexing

解决方案


如果可能,将小时和日期列转换为 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

推荐阅读