数据框列到行的递归引用

时间:2017-04-21 05:13:15

标签: python python-3.x pandas

考虑以下程序,其中,我创建了一个包含三列的多索引数据框,并最终使用嵌套的列表元组列表填充了一列。我将索引展平并试图遍历行ix, rec = next(df.iterrows())。 然后,我从迭代行(rec.data)中取消引用数据列rec,发现它是一个内存对象<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 个答案:

答案 0 :(得分:1)

您似乎需要itertuples

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)]