2017-08-10 1 views
1

Ich habe dies df wie diese strukturiert, wo jedes Jahr die gleichen Zeilen/Einträge hat:eine Bedingung zu einer df Anwendung des Aggregats zu erhalten zählt

Year Name Expire 

2001 Bob  2002 
2001 Tim  2003 
2001 Will 2004 
2002 Bob  2002 
2002 Tim  2003 
2002 Will 2004 
2003 Bob  2002 
2003 Tim  2003 
2003 Will 2004 

ich die df (df [df [subsetted haben‘ Expire ']> df [' Year '])

2001 Bob  2002 
2001 Tim  2003 
2001 Will 2004 
2002 Tim  2003 
2002 Will 2004 
2003 Will 2004 

Jetzt möchte ich die Zählung für jedes Jahr die Menge von Namen zurückzugeben, die abgelaufen ist, so etwas wie:

Year count 
2001  0 
2002  1 
2003  1 

Wie kann ich das erreichen? Ich kann nicht (df [df ['Expire'] < = df ['Jahr']) ['name']. Groupby ('Jahr'). Agg (['count']), weil das würde nicht unnötig zurückkehren Zeilen für mich. Kann ich nur die letzte Instanz zählen?

+0

ist nicht 'df.groupby ([ 'Ablaufen']) [ 'Name']. Count()', was Sie brauchen? –

Antwort

0

IIUC: Sie können .apply verwenden und sum der wahren Werte, dh

df.groupby('Year').apply(lambda x: (x['Expire']<=x['Year']).sum()) 

Ausgang:

 
Year 
2001 0 
2002 1 
2003 2 
2

Sie groupby mit boolean Maske verwenden und Aggregat sum:

print (df['Expire']<= df['Year']) 
0 False 
1 False 
2 False 
3  True 
4 False 
5 False 
6  True 
7  True 
8 False 
dtype: bool 

df=(df['Expire']<=df['Year']).groupby(df['Year']).sum().astype(int).reset_index(name='count') 
print (df) 
    Year count 
0 2001  0 
1 2002  1 
2 2003  2 

Überprüfung:

print (df[df['Expire']<= df['Year']]) 
    Year Name Expire 
3 2002 Bob 2002 
6 2003 Bob 2002 
7 2003 Tim 2003 
Verwandte Themen