2016-07-31 66 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 
相關問題