来自Pandas DataFrame的可迭代对象

7
我需要创建一个迭代器,形式为(id, {特征名称: 特征权重}),以便使用Python包。我的数据存储在pandas数据框中,以下是一个示例:
data = pd.DataFrame({"id":[1,2,3],
                    "gender":[1,0,1],
                    "age":[25,23,40]})

对于{特性名称: 特性权重}这一部分,我知道可以使用以下方法:

fe = data.to_dict(orient='records')
Out[28]: 
[{'age': 25, 'gender': 1, 'id': 1},
 {'age': 23, 'gender': 0, 'id': 2},
 {'age': 40, 'gender': 1, 'id': 3}]

我知道我也可以遍历数据框以获取id,就像这样:
(row[1] for row in data.itertuples())

但我可以将这两个合并为一个可迭代对象(生成器对象) 我尝试了:
((row[1] for row in data.itertuples()),fe[i] for i in range(len(data)))

但是语法有误。你们知道怎么做吗?

2个回答

5

pd.DataFrame.itertuples 返回命名元组。您可以通过专门的方法_asdict迭代并将每行转换为字典。您可以将其包装在生成器函数中,以创建一个惰性读取器:

data = pd.DataFrame({"id":[1,2,3],
                    "gender":[1,0,1],
                    "age":[25,23,40]})

def gen_rows(df):
    for row in df.itertuples(index=False):
        yield row._asdict()

G = gen_rows(data)

print(next(G))  # OrderedDict([('age', 25), ('gender', 1), ('id', 1)])
print(next(G))  # OrderedDict([('age', 23), ('gender', 0), ('id', 2)])
print(next(G))  # OrderedDict([('age', 40), ('gender', 1), ('id', 3)])

请注意,结果将是OrderedDict对象。作为dict的子类,对于大多数目的来说,这应该足够了。

2
我认为需要先使用列名为“id”的set_index方法,然后使用to_dict方法并设置参数orient='index'
fe = data.set_index('id', drop=False).to_dict(orient='index')
print (fe)
{1: {'id': 1, 'gender': 1, 'age': 25}, 
 2: {'id': 2, 'gender': 0, 'age': 23},
 3: {'id': 3, 'gender': 1, 'age': 40}}

谢谢!我只需添加((i,v) for i,v in fe.items())以获得可迭代的对象。 - blabla
@blabla - 很高兴能够帮忙! - jezrael

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接