2016-04-01 7 views
1

私はちょうどPython(pandas)で作業を始めました。今は最初の質問があります。 私は、次の行名を持つデータフレームを持っている:データフレームは行の名前としてグループ化された行の値を使用します

ID A Class 
1 True [0,5] 
2 False [0,5] 
3 True [5,10] 
4 False [10,20] 
5 True [0,5] 
6 False [10,20] 

は今、私はこのような何かを行うことができますクールなソリューション、を探しています:

Class True False 
[0,5] 2  1 
[5,10] 1  0 
[10,20] 0  2 

私はTrueどれだけをカウントしたいですFalse私はClassのために持っています 高速なソリューションはありますか?私のデータフレームは2百万以上のエントリを持つことができます。

答えて

1

dfをしてみましょうことが、あなたのデータフレームを、私が最初に使用します。

g = df.groupby('Class')['A'].value_counts().reset_index() 

返す:

 Class  A 0 
0 [0,5] True 2 
1 [0,5] False 1 
2 [10,20] False 2 
3 [5,10] True 1 

は、私が旋回しますあなたの希望の形状を得るために上記の表:

a = pd.pivot_table(g, index='Class', columns='A', values=0).fillna(0) 

返信:

A  False True 
Class     
[0,5]  1.0 2.0 
[10,20] 2.0 0.0 
[5,10]  0.0 1.0 
+1

'Class'の型が文字列ではなくリストである場合、これは非ハッシュ型の例外をスローします。 –

+0

これを指摘してくれてありがとう。それは他の答えの場合にも起こりますか? –

+0

です。コメントする。 –

4

pivot_tableを使用して集計を行うことができます。その後、必要な出力と一致するように列名とインデックスをフォーマットするだけです。

# Perform the pivot and aggregation. 
df = pd.pivot_table(df, index='Class', columns='A', aggfunc='count', fill_value=0) 

# Format column names and index to match desired output. 
df.columns = [c[1] for c in df.columns] 
df.reset_index(inplace=True) 

結果出力:

 Class False True 
0 [0,5]  1  2 
1 [10,20]  2  0 
2 [5,10]  0  1 

編集:

上記溶液は'Class'列の要素は文字列であることを前提としています。彼らはリストがある場合は、次の操作を行うことができます:

df['Class'] = df['Class'].map(tuple) 
**original solution code here** 
df['Class'] = df['Class'].map(list) 
+0

私はそれをPython 2.7およびpandas 0.18.0で動作させることができませんでした。それは 'aggfunc = len'でも動作します。 – ayhan

+0

それは奇妙です。 Python 3.5&Pandas 0.18.0で動作します。 – root

+0

インデックスだけを持つデータフレームを返します。カウントはありません。 True/Falseの値がどう扱われるかに関する問題? – ayhan

関連する問題