是否有办法每天删除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:
这样处理大型数据集的速度很慢的数据帧行迭代,我想不出办法做到这一点。
答案 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