2016-04-05 5 views
0

Ich habe einen Datenrahmen, mit Reihen darin, die ich auf einem Zustand der Spalte ‚Prev_Time‘ bedingtWie zählen Zeilen in einem Datenrahmen in Pandas bedingt mit Werten in einer anderen Spalte desselben Datenrahmens?

 TIME VALUE Prev_Time 
0 23:01  0  NaN 
1 23:02  0  NaN 
2 23:03  1  23:02 
3 23:04  0  NaN 
4 23:05  0  NaN 
5 23:06  1  23:05 
6 23:07  0  NaN 
7 23:08  0  NaN 
8 23:09  0  NaN 
9 23:10  0  NaN 
10 23:11  1  23:10 
11 23:12  0  NaN 
12 23:13  0  NaN 
13 23:14  0  NaN 
14 23:15  0  NaN 
15 23:16  1  23:15 
16 23:17  0  NaN 

Ich möchte zählen die Zeilen basierend zählen möchten, so dass ...

  1. In der ersten Iteration beginnt es die Zeilen bis zu einer Zeile zu zählen, bevor es die 'Prev_Time' in der Spalte findet.
  2. Zweitens und der Rest der Iterationen beginnt es zu zählen, einschließlich der Zeile, in der die Zeit gedruckt wird.

Das sollte gewünschte Ausgangs

ROW_COUNT 
0   2 
1   3 
2   5 
3   5 
4   2 

Und ich möchte Summe zu Zählt, somehting wie (len (df)), die

Total Count: 5 
+0

Gibt es die 'Prev_Time'-Spalte bereits oder fragen Sie, wie Sie das erstellen würden und sammeln Sie dann die Zeilenanzahl, in der' Prev_Time' einen Wert hat? – Grr

+0

@Grr Ja, die Spalte 'Prev_Time' ist bereits vorhanden. – wafers

Antwort

3

Die guten Linien:

notnull=df[df.VALUE>0] 
""" 
    TIME VALUE Prev_Time 
2 23:03  1  23:02 
5 23:06  1  23:05 
10 23:11  1  23:10 
15 23:16  1  23:15 
""" 

Verwendung np.split zu brechen:

row_counts=pd.DataFrame({'ROW_COUNT':[len(x) for x in np.split(df,notnull.index)]}) 
""" 
    ROW_COUNT 
0   2 
1   3 
2   5 
3   5 
4   2 
""" 

und zählen:

0

Diese etwas funktioniert gedruckt werden soll, können Sie twerk den Code auf Ihre Bedürfnisse, aber Grundidee etwas!

#Dummy data set 
df1 = pd.DataFrame({'TIME': np.arange(17), 'VALUE': np.arange(-17,0), 'Prev_time': [np.nan, np.nan,1, np.nan, np.nan,2, np.nan, np.nan, np.nan, np.nan,4, np.nan, np.nan, np.nan, np.nan,5, np.nan]}) 
#gets the rows that are not null and extracts their index number 
df=df1[df1['Prev_time'].notnull()].reset_index() 
#Checking for the case where the last row might be null, 
#need to add it manually to the index 
if df.loc[len(df)-1]['index'] != (len(df1)-1): 
    df.loc[len(df)]=[len(df1),0,0,0] 
count=df['index']-df['index'].shift(1).fillna(0) 
len(count) 
0

Es kann keine perfekte Antwort sein, so bekommen, was Sie suchen:

import pandas as pd 

#read the data 
d = pd.read_csv('stackdata.txt') 

#we need the last row to be identified, so give it a value 
d['Prev_Time'][len(d)-1]=1 

#get all the rows where Prev_Time is not null 
ds = d[d.Prev_Time.notnull()] 

#reset the index, you shall get an additional column named index 
ds = ds.reset_index() 
#get only the newly added index column 
dst = ds[ds.columns[0]] 

#get the diff of the series 
dstr = dst.diff() 

#Get the first value from the previous series and assign it. 
dstr[0] = dst[0] 

#Addd +1 to the last item -- result required. 
dstr[len(dstr)-1] +=1 
len(dstr) 
Verwandte Themen