4

これは別の方法で解決できます。しかし、リスト内包表記で pandas DataFrame を反復処理しようとしてもうまくいかない理由を正確に理解することに興味があります。(ここaにデータフレームがあります)

def func(a,seed1,seed2):
    for i in range(0,3):
        # Sum of squares. Results in a series containing 'date' and 'num' 
        sorted1 = ((a-seed1)**2).sum(1)
        sorted2 = ((a-seed2)**2).sum(1)

        # This makes a list out of the dataframe. 
        a = [a.ix[i] for i in a.index if sorted1[i]<sorted2[i]]
        b = [a.ix[i] for i in a.index if sorted1[i]>=sorted2[i]]
        # The above line throws the exception:
        # TypeError: 'builtin_function_or_method' object is not iterable

        # Throw it back into a dataframe...

        a = pd.DataFrame(a,columns=['A','B','C'])
        b = pd.DataFrame(b,columns=['A','B','C'])

        # Update the seed.
        seed1 = a.mean()
        seed2 = b.mean()

        print a.head()
        print "I'm computing."
4

1 に答える 1

3

問題は最初の行の後であり、a はもはや DataFrame ではありません。

a = [a.ix[i] for i in a.index if sorted1[i]<sorted2[i]]
b = [a.ix[i] for i in a.index if sorted1[i]>=sorted2[i]]

これはリストであるため、インデックス属性がありません (したがって、エラーが発生します)。

Python のトリックの 1 つは、これを 1 行で行う (同時に定義する) ことです。つまり、次のようになります。

a, b = [a.ix[i] for ...], [a.ix[i] for ...]

おそらくより良いオプションは、ここで別の変数名を使用することです (例: df)。

あなたが言うように、パンダでこれを行うためのより良い方法があります.明らかな方法は、マスクを使用することです:

msk = sorted1 < sorted2

seed1 = df[msk].mean()
seed2 = df[~msk].mean()
于 2013-08-20T16:54:07.440 に答える