可从熊猫数据框迭代

Posted

技术标签:

【中文标题】可从熊猫数据框迭代【英文标题】:iterable from pandas dataframe 【发布时间】:2018-12-03 22:14:37 【问题描述】:

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

我的数据存储在 pandas 数据框中,这里是一个示例:

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

对于 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]

我知道我也可以遍历 datframe 以获取 id,如下所示:

(row[1] for row in data.itertuples())

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

((row[1] for row in data.itertuples()),fe[i] for i in range(len(data)))

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

【问题讨论】:

【参考方案1】:

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】:

我认为首先需要set_index 按列id 然后to_dictorient='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

【讨论】:

这个作品也是!谢谢 !我只是在 fe.items()) 中添加 ((i, v) for i, v) 以获得可迭代。 @blabla - 很高兴能帮上忙!

以上是关于可从熊猫数据框迭代的主要内容,如果未能解决你的问题,请参考以下文章

迭代熊猫数据框

如何迭代熊猫数据框列中的元素?

如何在熊猫中迭代数据框时保留数据类型?

按日期迭代熊猫数据框的正确方法

涉及即时数据框对象的嵌套熊猫迭代

如何迭代熊猫数据框的列以运行回归