2016-07-31 81 views
1

是否有办法删除Dataframe中的第一行,每天只有一定的值。例如:每天只删除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

您可以先groupbyDatetimeIndex.year和聚合head。然后找到所有一级指标,其中列的值是通过1boolean indexing最后drop他们:

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

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 
+0

这是比迭代数据帧好得多。再次感谢jezrael。 – ade1e

+0

很高兴能为您提供帮助。美好的一天! – jezrael

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