2017-07-10 5 views
2

私は "sentences"というデータフレームを持っており、そこからキーワードを検索したいと考えています。私のキーワードが文字「A」であるとしましょう。サンプルデータ:あるPython pandas counting

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

、「インデックス」欄には、各文章で「A」の最初の出現の指標を示す(-1見つからない場合)。列をそれぞれの年のレコードにグループ化し、それぞれのレコードの「A」の発生率を示す列を作成します。それは次のとおりです。

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

私は、これはいくつかの方法でaggまたはgroupbyを含むが、どのように一緒に文字列にこれらをする私は明確ではないんだという気持ちを持っています。私が得ている限り:ここでの問題は、()最初に、私たちは最初に、その分割し、「A」を含む年間201Xの行数を数えるところ、条件数のいくつかの種類

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

しかしあります201X年の行数で表します。

答えて

2

あなたはboolean indexingvalue_countsまたはGroupBy.sizeを使用することができます。

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 

または:divによって

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 

そして最後デバイド:

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を使用し は、ここで一つだけgroubyで、一例ですすでに

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

year 
2015 0.666667 
2016 1.000000 
2017 0.000000 
Name: index, dtype: float64 
をチェックした indexを使用して
df.sentence.str.contains('A').groupby(df.year).mean() 

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