将由 JSON 列表组成的 Pandas 列转换为新列

3

我有一个DataFrame,其中包含3列:

order_id  user_id  Details
5c7c9     A        [{"amount": "160",'id':'p2'},{"amount": "260",'id':'p3'}]
5c5c4     B        [{"amount": "10",'id':'p1'},{"amount": "260",'id':'p3'}]

我希望我的最终数据框架如下:

order_id  user_id  amount  id
5c7c9     A        160     p2
5c7c9     A        260     p3
5c5c4     B        10      p1
5c5c4     B        260     p3

你目前尝试了什么? - Arkistarvh Kltzuonstev
我的第一个需求是仅处理读取产品列,为此我使用了以下代码:从bson.json_util中导入dumps import json r = collection.find() test=dumps(r)json_test=json.loads(test)df = pd.concat(map(lambda x: DataFrame(x[1]['products']), enumerate(json_test))) - sourav khanna
2个回答

3

首先,如果需要,将值转换为字典列表,使用ast.literal_eval。然后,使用字典推导式结合DataFrame构造函数进行处理,并使用concat进行合并,最后使用DataFrame.join添加到原始数据中:

import ast

#df['Details'] = df['Details'].apply(ast.literal_eval)

df1 = (pd.concat({k: pd.DataFrame(v) for k, v in df.pop('Details').items()})
         .reset_index(level=1, drop=True))

df = df.join(df1, rsuffix='_').reset_index(drop=True)
print (df)
  order_id user_id amount  id
0    5c7c9       A    160  p2
1    5c7c9       A    260  p3
2    5c5c4       B     10  p1
3    5c5c4       B    260  p3

@souravkhanna - 可以省略它,只有在“详细信息”列中包含字符串时才需要。 - jezrael
出现了其他错误:ValueError: 列重叠但未指定后缀:Index(['_id'], dtype='object')。 - sourav khanna
@souravkhanna - 编辑回答,将 df = df.join(df1).reset_index(drop=True) 更改为 df = df.join(df1, rsuffix='_').reset_index(drop=True) - jezrael
它可以工作。是我的错,我在问题中没有提到“_id”:( - sourav khanna
1
@Snapula - 你可以尝试将 df.pop('Details').items() 更改为 df.pop('Details').dropna().items() - jezrael
显示剩余3条评论

1

您可以使用:

s=pd.DataFrame([[x] + [z] for x, y in zip(df1.index,df1.Details) for z in y])
s=s.merge(df1,left_on=0,right_index=True).drop(['Details',0],1)
print(s.pop(1).apply(pd.Series).join(s))

  amount  id order_id user_id
0    160  p2    5c7c9       A
1    260  p3    5c7c9       A
2     10  p1    5c5c4       B
3    260  p3    5c5c4       B

我该如何仅提取金额列? - sourav khanna
@souravkhanna 最终的数据框中,您需要执行 df['amount'] - anky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接