2016-08-27 12 views
-1

パンダのデータフレームグループを機能別に使用しているので、カラムc_bでグループ化し、カラムc_aとカラムc_cの一意の数を計算したいと思います。私の予想結果は、pandas group by confusion - unhashable type

期待される結果

c_b,c_a_unique_count,c_c_unique_count 
python,2,2 
c++,2,2 

unhashable typeについての奇妙なエラーで満たされている、誰もが任意のアイデアがありますか?ありがとう。

入力ファイル、UNIの数については

c_a,c_b,c_c,c_d 
hello,python,numpy,0.0 
hi,python,pandas,1.0 
ho,c++,vector,0.0 
ho,c++,std,1.0 
go,c++,std,0.0 

ソースコード

sample = pd.read_csv('123.csv', header=None, skiprows=1, 
    dtype={0:str, 1:str, 2:str, 3:float}) 
sample.columns = pd.Index(data=['c_a', 'c_b', 'c_c', 'c_d']) 
sample['c_d'] = sample['c_d'].astype('int64') 
sampleGroup = sample.groupby('c_b') 
results = sampleGroup.count()[:,[0,2]] 
results.to_csv(derivedFeatureFile, index= False) 

エラーメッセージ

Traceback (most recent call last): 
    File "/Users/foo/personal/featureExtraction/kaggleExercise.py", line 134, in <module> 
    unitTest() 
    File "/Users/foo/personal/featureExtraction/kaggleExercise.py", line 129, in unitTest 
    results = sampleGroup.count()[:,[0,2]] 
    File "/Users/foo/miniconda2/lib/python2.7/site-packages/pandas/core/frame.py", line 1997, in __getitem__ 
    return self._getitem_column(key) 
    File "/Users/foo/miniconda2/lib/python2.7/site-packages/pandas/core/frame.py", line 2004, in _getitem_column 
    return self._get_item_cache(key) 
    File "/Users/foo/miniconda2/lib/python2.7/site-packages/pandas/core/generic.py", line 1348, in _get_item_cache 
    res = cache.get(item) 
TypeError: unhashable type 
+1

'sampleGroup.countは()[:、[0,2]]'何をここでやろうとしていますか?第1列と第3列を取得する場合は、 'sampleGroup.count()。iloc [:、[0,2]]'に変更してみてください(groupbyオブジェクトでも可能です)。 ( 'df.groupby( 'a')[[0、2]]。count()') – ayhan

+0

ありがとう@ayhan、あなたのメソッドは動作しますが、結果は 'c_a'と' c_d'カラムしかないようですが間違っています - グループ化された列であるため、 'c_b'は自動的に含まれていると思います。 ' c_a、c_d 3,3 2,2' –

+1

はいグループ化する列がインデックスになります。それらの列にもラベルでアクセスできます。予想される出力は何ですか? – ayhan

答えて

1

あなたが使用することができ、各グループのqueの要素、:

df.groupby('c_b')['c_a', 'c_d'].agg(pd.Series.nunique) 

df.groupby('c_b')['c_a', 'c_d'].agg(pd.Series.nunique) 
Out: 
     c_a c_d 
c_b    
c++  2 2 
python 2 2 

df.groupby('c_b', as_index=False)['c_a', 'c_d'].agg(pd.Series.nunique) 
Out: 
     c_b c_a c_d 
0  c++ 2 2 
1 python 2 2 
+0

ありがとう、最後の2つの例の違いは、追加の整数増分列があるかどうかです。 –

+0

助けをいただきありがとうございました。回答を回答として記入してください。 –

+1

これはデータフレームのインデックスです。最初のものでは、インデックスは 'c_b'です。 – ayhan