【问题标题】:Nested dictionaries - lists of dictionaries in each other嵌套字典 - 相互之间的字典列表
【发布时间】:2015-01-21 21:44:58
【问题描述】:

我最初有一个逐行导入的 jsonL 文件,现在正尝试进入 Pandas 数据框。一个条目如下所示:

*[{u'country': u'denmark',
  u'gender': u'F',
  u'item_type': u'user',
  u'location': u'Denmark',
  u'name': u'Mona',
  u'profile_text': u'',
  u'reviews': [{u'company_id': u'stylepit.dk',
    u'date': u'2013-10-06T18:54:49.000+00:00',
    u'rating': u'4',
    u'text': [u'Altid glad for at handle hos Smartkids - stort sortiment af mange m\xe6rker nemt og hurtigt'],
    u'title': u'Som altid kommer varerne hurtigt - super fint'},
   {u'company_id': u'www.coolshop.dk',
    u'date': u'2012-10-28T19:00:56.000+00:00',
    u'rating': u'5',
    u'text': [u'F\xf8rste gang jeg har handlet hos Coolshop, det var super nemt og hurtigt og de har et fint udvalg, hjemmesiden har flotte fotos af varen s\xe5 jeg var ikke i tvivl om hvad jeg bestilte. Jeg k\xf8ber gerne igen hos Coolshop.',
     u'med venlig hilsen',
     u'Mona Pedersen Ulstrup'],
    u'title': u'Super hurtig ekspedering'},
   {u'company_id': u'www.yourkids.dk',
    u'date': u'2010-09-26T19:47:51.000+00:00',
    u'rating': u'5',
    u'text': [u'Har k\xf8bt rigtig mange cars via yourkids, nok den eneste side i Danmark hvor du bare kan f\xe5 alle de sidste nye biler.',
     u'Lige sagen for en cars samler. Der er altid rigtig meget service, min bedste anbefaling'],
    u'title': u'Super super service'}]*

所以,我有一群用户可能有一个或多个评论作为字典列表。我需要将评论列表与熊猫中的每个用户进行匹配。我刚刚做了以下事情:

dataframe = pd.DataFrame(reviews)

sub_data = []
for i in dataframe['reviews']:
    for j in i:
        sub_data.append(j)
subdata_frame = pd.DataFrame(sub_data)
subdata_frame

这给了我两个单独的数据框,当它们连接时,显然不会将用户与评论匹配,而是将新列添加到相互数据框,并且只是在底部添加额外评论而没有用户信息.

如何将评论数据与我的用户相关联?

【问题讨论】:

    标签: dictionary pandas nested


    【解决方案1】:

    我之前在这里回答过这个问题Creating pandas dataframe from list of dictionaries containing lists of data。但是,我已经看到了类似的问题和过去,并决定发布一个更通用的解决方案

    通常对于像这样的嵌套数据类型,我将内部数据与外部数据合并。在您的情况下,您的内部数据是评论,它本身可以用 DataFrame 很好地表示。

    def fixInnerData(df,innerDataCol,cols = False):
        if cols: f = lambda x:pd.DataFrame(x.iloc[0],columns = cols)
        else:    f = lambda x:pd.DataFrame(x.iloc[0])
    
        fix = df.groupby(level=0)[innerDataCol].apply(f)
        fix = fix.reset_index(level=1,drop=True)
        df = pd.merge(fix,df.drop([innerDataCol],1),how='inner',left_index=True,right_index=True)
        return df
    
    df = pd.DataFrame(data)
    innerDataCol = 'reviews'
    fixInnerData(df,innerDataCol)
    

    这种方法很棒,因为您可以将它与循环一起使用并拉出字典的所有级别

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-22
      • 1970-01-01
      • 2021-05-10
      • 1970-01-01
      • 2020-12-15
      • 2018-10-16
      • 1970-01-01
      相关资源
      最近更新 更多