【问题标题】:Turning Pandas Dataframe into list of dictionaries将 Pandas Dataframe 转换为字典列表
【发布时间】:2021-05-06 19:53:03
【问题描述】:

我有一个如下所示的 DataFrame:

df = pd.DataFrame({"id": ["200"], "0": ["miner"], "1": ["miner, manager"], "2": ["mining, dude number 7"], "3": ["marshall"]})

我想把它变成一个字典列表,其中键为 "id""value" 上重复,它们是每一列的值 @987654322 @如果它存在看起来像一个输出:

list_dict_from_df = [{"id": "200", "value": [{"lower": "miner"}]}, {"id": "200", "value": [{"lower": "miner"}, {"lower": "manager"}]}, {"id": "200", "value": [{"lower": "mining"}, {"lower": "dude number 7"}]}, {"id": "200", "value": [{"lower": "marshall"}]}]

我目前正在循环中使用蛮力方法来执行此操作:

d_range = range(1, len(df.columns)
d_out = []

for i in d_range:
   d_out.append({"id": code, "value": [{"lower": col} for col in df.iloc[:, i].str.split(',')]})

这让我很接近:

d_out:

[{"id": 200, "value": [{"lower": ["miner"]}]}, {"id": 2000, "value": [{"lower": ["miner", "manager"]}]}]

但是,我不希望字符串“miner”包含在列表中,而是用“,”分隔,并且它们的每个元素都包含在一个 id 值中,如上所示。

如果可能的话,我更喜欢找到一个非反模式的 DataFrame 解决方案(不是 iterrows() 类型)...

【问题讨论】:

    标签: python pandas list dataframe dictionary


    【解决方案1】:

    试试:

    from pprint import pprint
    
    lst = []
    for id_, g in df.groupby("id"):
        for _, row in g.iterrows():
            for cell in row["0":]:
                lst.append(
                    {
                        "id": id_,
                        "value": [
                            {"lower": v} for v in map(str.strip, cell.split(","))
                        ],
                    }
                )
    
    
    pprint(lst)
    

    打印:

    [{'id': '200', 'value': [{'lower': 'miner'}]},
     {'id': '200', 'value': [{'lower': 'miner'}, {'lower': 'manager'}]},
     {'id': '200', 'value': [{'lower': 'mining'}, {'lower': 'dude number 7'}]},
     {'id': '200', 'value': [{'lower': 'marshall'}]}]
    

    【讨论】:

      【解决方案2】:

      这是在重塑数据后的一种方法,使 id 为set_index,然后所有列都变为带有stack 的行,并使用explode 以逗号分隔一次str.split 获得一行。循环 groupby 索引以获得预期的输出

      d = [{'id':i, 'value':vals.to_dict(orient='records')}
           for (i, _), vals in df.set_index('id').stack()
                                 .str.split(',').explode()
                                 .to_frame(name='lower')
                                 .groupby(level=[0,1])
          ]
      
      d
      [{'id': '200', 'value': [{'lower': 'miner'}]},
       {'id': '200', 'value': [{'lower': 'miner'}, {'lower': ' manager'}]},
       {'id': '200', 'value': [{'lower': 'mining'}, {'lower': ' dude number 7'}]},
       {'id': '200', 'value': [{'lower': 'marshall'}]}]
      

      【讨论】:

      • timeit df.T.to_dict().values()
      猜你喜欢
      • 2014-01-05
      • 2021-11-28
      • 1970-01-01
      • 2022-12-01
      • 2018-10-26
      • 2021-11-10
      相关资源
      最近更新 更多