【问题标题】: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)))

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

【问题讨论】:

    标签: python python-3.x pandas dataframe iterable


    【解决方案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 - 很高兴能帮上忙!
      猜你喜欢
      • 2020-05-17
      • 2015-12-09
      • 2020-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-14
      • 2021-09-17
      • 1970-01-01
      相关资源
      最近更新 更多