可从熊猫数据框迭代

bla*_*bla 6 python iterable dataframe python-3.x pandas

我需要为使用 python 包创建一个形式 (id, {feature name: features weight}) 的迭代。

我的数据存储在熊猫数据框中,这里有一个例子:

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

对于 {feature name: features weight}) 部分,我知道我可以使用这个:

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}]
Run Code Online (Sandbox Code Playgroud)

我知道我也可以遍历数据框来获取 id,如下所示:

(row[1] for row in data.itertuples())
Run Code Online (Sandbox Code Playgroud)

但是我可以将这两个放在一起以获得我尝试过的一个可迭代(生成器对象):

((row[1] for row in data.itertuples()),fe[i] for i in range(len(data)))
Run Code Online (Sandbox Code Playgroud)

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

jpp*_*jpp 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)])
Run Code Online (Sandbox Code Playgroud)

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