2016-08-18 2 views
1

ここに私の仕事の非常に短い記述があります。私はこのようなデータフレームを持っています:df = pd.DataFrame([[2, 0], [2, 1], [1, 0], [1, 0], [1, 1], [3, 0]], columns=['topic', 'strange'])パンダはトピックの奇妙さを計算する

すべてのトピックについて、「奇妙な」行の割合を計算する必要があります。結果は1 - 1/3, 2 - 1/2, 3 - 0のようになります。

私が出ている最も効率的な解決策は以下のとおりです。

a = df['topic'].value_counts() 
b = df[df['strange'] == 1]['topic'].value_counts() 
res = (b/a).fillna(0) 

また、これは私は、これはスマートGROUPBY操作で容易に達成することができることを信じて、おそらくその醜い合理的パフォーマンスとではありません。

他に提案がありますか?より短いまたはより速い選択肢を探してください。 strangeは0または1のみであることが保証されている場合は

答えて

2

、あなただけの平均値をとることができます。

In [7]: df.groupby("topic").mean() 
Out[7]: 
     strange 
topic 
1  0.333333 
2  0.500000 
3  0.000000 
+0

実際に奇妙がブール値です。それは保証されています。これは明らかに私のものよりも短く、私の10mln行のデータフレームでは、200kの奇妙な要素で、あなたのソリューションの時間がわずかに短縮されます。** ** 2.97 **に対して3.22秒** –