每天删除Dataframe中的第一行仅限特定值

时间:2016-07-31 19:43:42

标签: python pandas

是否有办法每天删除Dataframe中的第一行,仅限某些值。例如:

2014-03-04 10:00:00   -1.0
2014-03-04 10:04:00    1.0
2014-03-04 10:42:00   -1.0

2014-03-05 09:57:00    1.0
2014-03-05 10:05:00   -1.0
2014-03-05 10:30:00    1.0

对于上面的每一天,如果1.0是第一个值,则应该删除该行。因此,在上面的示例中,这会删除行2014-03-05 10:00:00

如果没有使用for day in df.index:这样处理大型数据集的速度很慢的数据帧行迭代,我想不出办法做到这一点。

2 个答案:

答案 0 :(得分:3)

您可以groupby DatetimeIndex.year之前1汇总head。然后找到所有第一个索引,其中列的值print (df) col 2014-03-04 10:00:00 -1.0 2014-03-04 10:04:00 1.0 2014-03-04 10:42:00 -1.0 2014-03-05 09:57:00 1.0 2014-03-05 10:05:00 -1.0 2014-03-05 10:30:00 1.0 df1 = df.col.groupby(df.index.date).head(1) print (df1) 2014-03-04 10:00:00 -1.0 2014-03-05 09:57:00 1.0 Name: col, dtype: float64 print (df1[df1 == 1].index) DatetimeIndex(['2014-03-05 09:57:00'], dtype='datetime64[ns]', freq=None) print (df.drop(df1[df1 == 1].index)) col 2014-03-04 10:00:00 -1.0 2014-03-04 10:04:00 1.0 2014-03-04 10:42:00 -1.0 2014-03-05 10:05:00 -1.0 2014-03-05 10:30:00 1.0 boolean indexing,最后drop为:

如果日期时间不重复,此解决方案效果很好。

Net view $StorageName

答案 1 :(得分:0)

这是使用apply方法创建掩码变量的另一种方法,用于检查每个组并获取第一个元素的条件,然后使用mask进行子集化:

import pandas as pd
import numpy as np
df['date_time'] = pd.to_datetime(df.date_time)
df

#             date_time  value
#0  2014-03-04 10:00:00     -1
#1  2014-03-04 10:04:00      1
#2  2014-03-04 10:42:00     -1
#3  2014-03-05 09:57:00      1
#4  2014-03-05 10:05:00     -1
#5  2014-03-05 10:30:00      1

# group by the date of the column `date_time`
groups = df.groupby(df.date_time.apply(lambda dt: dt.date()))['value']

# create a mask that returns true if the first element of every group is one
mask = groups.apply(lambda g: pd.Series((np.arange(g.size) == 0) & (g == 1)))

mask
# 0    False
# 1    False
# 2    False
# 3     True
# 4    False
# 5    False
# dtype: bool


df[~mask]

#             date_time   value
#0  2014-03-04 10:00:00      -1
#1  2014-03-04 10:04:00       1
#2  2014-03-04 10:42:00      -1
#4  2014-03-05 10:05:00      -1
#5  2014-03-05 10:30:00       1