嵌套字典 - 彼此的字典列表

时间:2014-11-24 08:17:29

标签: dictionary pandas nested

我最初有一个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'}]*

所以,我有一堆用户可能会有一个或多个评论作为词典列表。我需要将评论列表与pandas中的每个用户进行匹配。我刚做了以下几件事:

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

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

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

1 个答案:

答案 0 :(得分:0)

我在此之前回答了这个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)

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