2017-08-23 22 views
-1

k-means結果データフレームのエントロピーを取得しようとしていますが、エラーが戻ってきています:TypeError: 'numpy.int32'オブジェクトは反復不可能です 理由を理解できません。Python TypeError: 'numpy.int32'オブジェクトが反復可能ではありません

from collections import Counter 
def calcEntropy(x): 
    p, lens = Counter(x), np.float(len(x)) 
    return -np.sum(count/lens*np.log2(count/lens) for count in p.values()) 
k_means_sp['entropy']=[calcEntropy(x) for x in k_means_sp['cluster']] 

と、私はエラーメッセージが表示されます:

<ipython-input-26-d375ecf00330> in <module>() 
----> 1 k_means_sp['entropy']=[calcEntropy(x) for x in k_means_sp['cluster']] 

<ipython-input-26-d375ecf00330> in <listcomp>(.0) 
----> 1 k_means_sp['entropy']=[calcEntropy(x) for x in k_means_sp['cluster']] 

<ipython-input-23-f5508ea8782c> in calcEntropy(x) 
     1 from collections import Counter 
     2 def calcEntropy(x): 
----> 3  p, lens = Counter(x), np.float(len(x)) 
     4  return -np.sum(count/lens*np.log2(count/lens) for count in p.values()) 

/Users/mpiercy/anaconda/lib/python3.6/collections/__init__.py in __init__(*args, **kwds) 
    535    raise TypeError('expected at most 1 arguments, got %d' % len(args)) 
    536   super(Counter, self).__init__() 
--> 537   self.update(*args, **kwds) 
    538 
    539  def __missing__(self, key): 

/Users/mpiercy/anaconda/lib/python3.6/collections/__init__.py in update(*args, **kwds) 
    622      super(Counter, self).update(iterable) # fast path when counter is empty 
    623    else: 
--> 624     _count_elements(self, iterable) 
    625   if kwds: 
    626    self.update(kwds) 

TypeError: 'numpy.int32' object is not iterable 

k_means_sp.head() 

     credit debit cluster 
0 9.207673 8.198884 1 
1 4.248495 8.202181 0 
2 8.149668 7.735145 2 
3 5.138677 7.859741 0 
4 8.058163 7.918614 2 
+1

'k_means_sp'が' numpy.int32'を保持していると仮定すると、 'numpy.int32'を' Counter'に渡しています。 'Counter 'は' iterable'を取るべきです。 –

+0

私はクラスタの列をcluster = [0,1,2]とy = iter(cluster)にする必要がありますか、これを完全に間違っているのですか?ありがとう! – bananablue1

+0

@ bananablue1これは、現在書かれているように、「calcEntropy」に整数を渡すことができないことを意味します。行うべき正しいことは、あなたの目標に依存します。 'calcEntropy'が整数で動作するようにしたい場合(それは意味がありますか?)、' calcEntropy'に何か他のものを渡したい場合は修正してください。 – Goyo

答えて

0

[OK]を、これは最初の試みです。あなたのデータフレームが'cluster'カラムにクラスタインデックスを格納しているようです。だから、何をする必要がインデックスに基づいて、各クラスタを取得し、その後、あなたのcalcEntropy関数にそのクラスタを渡し、

for i in xrange(len(k_means_sp['cluster'].unique())) # loop thru cluster indices: 
    cluster = k_means_sp.ix[k_means_sp['cluster'] == i][['credit', 'debit']] 
    entropy = calcEntropy(cluster) 
のようなもの

2行目は、同じクラスタを持っているものだけに行をフィルタリングしていますインデックス。これは役に立ちますか?

+0

ありがとうございました! – bananablue1

関連する問題