2017-04-21 5 views
0

次のプログラムでは、3つの列を持つマルチインデックスデータフレームを作成し、最終的に列の1組にリストのタプルリストを入れました。私はインデックスを平らにして、行全体を反復しようとしましたix, rec = next(df.iterrows())。 その後、反復行(rec)からデータ列rec.dataを参照解除し、メモリオブジェクト<memory at 0x000000000D6E0AC8>であることがわかりました。レコードrec.data.objにあるobjを呼び出すと、行全体の内容を持つ配列であることが分かりました。実際のコンテンツに到達するには、直感的ではないアイテムインデックスを取得する必要があります。データフレーム列の行への再帰的参照

>>> print(rec.data.obj[2]) 
[(['9', '"', 'X', '12', '"'], 0.9993008259451988)] 

サンプル作り直し例

def foo(): 
    return [(['9', '"', 'X', '12', '"'], 0.99930082594519876)] 
import pandas as pd 

def spam(): 
    index = pd.MultiIndex(levels=[[], []], 
          labels=[[], []], 
          names=[u'timestamp', u'key']) 
    columns = ['data', 'col1', 'col2'] 
    df = pd.DataFrame(index=index, columns=columns) 
    for ix in range(4): 
     key = ('XXX', ix) 
     df.loc[key, 'data'] = str(foo()) 
     df.loc[key, 'col1'] = "col1_{}".format(ix) 
     df.loc[key, 'col2'] = "col2_{}".format(ix) 
    df.reset_index(inplace=True) 
    return df 

def bar(): 
    df = spam() 
    ix, rec = next(df.iterrows()) 
    print(rec.data) 
    print(rec.data.obj) 
    print(rec.data.obj[2]) 

bar() 

出力

<memory at 0x000000000D6E0AC8> 
['XXX' 0 '[([\'9\', \'"\', \'X\', \'12\', \'"\'], 0.9993008259451988)]' 
'col1_0' 'col2_0'] 
[(['9', '"', 'X', '12', '"'], 0.9993008259451988)] 

私は無知だと理解することができない、私は

答えて

1

を何をしないのですあなたがを必要とするようです:

def bar(): 
    df = spam() 
    rec = next(df.itertuples()) 
    print (rec) 
    print (rec.data) 
bar() 
Pandas(Index=0, timestamp='XXX', 
     key=0, 
     data='[([\'9\', \'"\', \'X\', \'12\', \'"\'], 0.9993008259451988)]', 
     col1='col1_0', 
     col2='col2_0') 

[(['9', '"', 'X', '12', '"'], 0.9993008259451988)] 
+0

ありがとうございます。 'iterrows'を使っていた理由は、' itertuples'の上に列挙型を避けたかったからです。いずれにしても、なぜ私のコードが失敗していたのか? – Abhijit

+0

いいえ、私は考えがあります。おそらくiteratorのために 'print(rec.Index)' – jezrael

関連する問題