2017-07-10 5 views
2

Ich habe einen Datenrahmen von "Sätzen", aus denen ich nach einem Schlüsselwort suchen möchte. Nehmen wir an, mein Keyword ist nur der Buchstabe "A". Beispieldaten:Python pandas counting

year | sentence | index 
----------------------- 
2015 | AAX  | 0 
2015 | BAX  | 1 
2015 | XXY  | -1 
2016 | AWY  | 0 
2017 | BWY  | -1 

Das heißt, die „Index“ Spalte zeigt den Index des ersten Auftretens von „A“ in jedem Satz (-1, wenn nicht gefunden). Ich möchte die Zeilen in ihren jeweiligen Jahren zusammenfassen, mit einer Spalte, die den Prozentsatz des Auftretens von "A" in den Aufzeichnungen jedes Jahres zeigt. Das heißt:

year | index 
------------- 
2015 | 0.667 
2016 | 1.0 
2017 | 0 

ich das Gefühl, dass diese agg oder groupby in irgendeiner Art und Weise geht, aber ich bin mir nicht klar, wie diese zusammen zu bespannen. Ich habe so weit gekommen wie:

df.groupby("index").count()

Aber die hier Ausgabe eine Art bedingter Zählung() ersten, wo wir zuerst die Anzahl der Zeilen in Jahr 201X zählen ‚A‘ enthalten, dann Dividieren, dass nach der Anzahl der Zeilen im Jahr 201X.

Antwort

2

Sie können value_counts oder GroupBy.size mit boolean indexing verwenden:

What is the difference between size and count in pandas?

df2 = df['year'].value_counts() 
print (df2) 
2015 3 
2017 1 
2016 1 
Name: year, dtype: int64 

df1 = df.loc[df['index'] != -1, 'year'].value_counts() 
print (df1) 
2015 2 
2016 1 
Name: year, dtype: int64 

Oder:

df2 = df.groupby('year').size() 
print (df2) 
year 
2015 3 
2016 1 
2017 1 
dtype: int64 

df1 = df.loc[df['index'] != -1, ['year']].groupby('year').size() 
print (df1) 
year 
2015 2 
2016 1 
dtype: int64 

Und letzte dividieren durch div:

print (df1.div(df2, fill_value=0)) 
2015 0.666667 
2016 1.000000 
2017 0.000000 
Name: year, dtype: float64 
0
from __future__ import division 
import pandas as pd 
x_df = # your dataframe 

y = x_df.groupby('year')['sentence'].apply(lambda x: sum(True if i.count('A') >0 else False for i in x)/len(x)) 

#or 

y = x.groupby('year')['index'].apply(lambda x: sum(True if i >=0 else False for i in x)/len(x)) 
0

sentence Verwendung zu überprüfen

df.sentence.str.contains('A').groupby(df.year).mean() 

year 
2015 0.666667 
2016 1.000000 
2017 0.000000 
Name: sentence, dtype: float64 

index verwenden, die

df['index'].ne(-1).groupby(df.year).mean() 

year 
2015 0.666667 
2016 1.000000 
2017 0.000000 
Name: index, dtype: float64 
bereits geprüft