猿问

从 Pandas 列中提取嵌套字典

我尝试从我的熊猫数据框中的嵌套字典创建一个数据框,但我无法让它工作......


我的数据框:


    created_at                  selected

    2019-08-13T12:24:53+00:00   {"982813":false,"1786112":true,"3002218":false}

    2019-08-31T13:47:51+00:00   {"309279":true,"1903384":false}

        ...

我想创建一个新的 df ,所选列数据的格式如下:


        created_at                  ID            Value

        2019-08-13T12:24:53+00:00   982813        false    

        2019-08-13T12:24:53+00:00   1786112       true

        2019-08-13T12:24:53+00:00   3002218       false

        2019-08-31T13:47:51+00:00   309279        true

        2019-08-31T13:47:51+00:00   1903384       false

        ...

我一直在尝试使用 explode() 和 json_normalize() 但没有成功,所以我决定使用 pd.DataFrame.from_dict() 和如下的 for 循环,但我遇到了错误。


x = {}

for row in df.selected:

    pd.DataFrame.from_dict(row, orient='index')

但我收到以下错误:


AttributeError:“str”对象没有属性“values”


我仍然是python的初学者,所以如果有人作为一个想法/解释我全神贯注。


慕桂英3389331
浏览 100回答 3
3回答

HUWWW

您想使用.apply(pd.Series),stack()然后重命名您的列:df.set_index('created_at')['selected'].apply(pd.Series).stack().reset_index().rename(columns={'level_1':'ID',0:'Value'})                  created_at       ID  Value0  2019-08-13T12:24:53+00:00   982813  False1  2019-08-13T12:24:53+00:00  1786112   True2  2019-08-13T12:24:53+00:00  3002218  False3  2019-08-31T13:47:51+00:00   309279   True4  2019-08-31T13:47:51+00:00  1903384  False顺便说一句,为了将来参考,您可以通过提供代码来复制您的起点来更快地获得答案。大部分时间我都在想这个:df = pd.DataFrame({"created_at": ['2019-08-13T12:24:53+00:00', '2019-08-31T13:47:51+00:00'], "selected": [{"982813":False,"1786112":True,"3002218":False}, {"309279":True,"1903384":False}]})

墨色风雨

这是一个向您展示这个想法的微型示例。如果您的音量很大,则不建议:import pandas as pddf = pd.DataFrame([[1, {'abc':11}], [2, {'def':22, 'ghi':33}]], columns=['id', 'dct'])lst = []for index, row in df.iterrows():    for key, value in row['dct'].items():        lst.append([row['id'], key, value])new = pd.DataFrame(lst, columns=['id', 'string', 'value'])print(new)

白猪掌柜的

在您的情况下,您可以explode在 0.25.0 之后在 pandas中使用df.BB=df.BB.map(lambda x : list(x.items()))s=df.explode('BB')pd.concat([s,pd.DataFrame(s.BB.tolist(),index=s.index)],axis=1)Out[93]:    CC      BB  0  10   1  (1, 2)  1  20   1  (2, 1)  2  11   2  (2, 2)  2  21   2  (8, 3)  8  31   2  (4, 5)  4  5数据df= pd.DataFrame({'CC':[1,2],'BB':[{1:2,2:1},{2:2,8:3,4:5}]})
随时随地看视频慕课网APP

相关分类

Python
我要回答