【问题标题】:Convert Pandas Column which Consist of list of JSON into new columns将包含 JSON 列表的 Pandas 列转换为新列
【发布时间】:2019-07-26 19:18:53
【问题描述】:

我有 3 列的 DataFrame:

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

【问题讨论】:

  • 到目前为止你尝试了什么?
  • 好吧,我的第一个要求是仅处理我使用的产品列 from bson.json_util import 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)))

标签: python json pandas


【解决方案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

【讨论】:

  • 我怎样才能只提取金额列?
  • @souravkhanna 你最后的 df df['amount']
【解决方案2】:

如有必要,首先通过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

【讨论】:

  • 获取错误:ValueError:错误的节点或字符串:[{'amount':'285','_id':'5bf69f5ca59f6202a7c95434','dmrp':'95','quantity':'3 ', 'mrp': '115'}, {'amount': '140', '_id': '5beaba4d1e748515b8558988', 'dmrp': '70', '数量': '2', 'mrp': '80 '}, {'amount': '21.17', '_id': '5c0f4f194449714eddac9554', 'dmrp': '21.17', 'quantity': '1', 'mrp': '25'}]
  • @souravkhanna - 可以省略它,只有当Details 列中的字符串时才有必要。
  • 其他错误出现:ValueError:列重叠但未指定后缀:Index(['_id'], dtype='object')
  • @souravkhanna - 编辑答案,将 df = df.join(df1).reset_index(drop=True) 更改为 df = df.join(df1, rsuffix='_').reset_index(drop=True)
  • @Snapula - 您可以尝试将df.pop('Details').items() 更改为df.pop('Details').dropna().items()
猜你喜欢
  • 2023-02-01
  • 2022-10-13
  • 2022-12-03
  • 1970-01-01
  • 2016-02-14
  • 2014-02-12
  • 2021-04-27
相关资源
最近更新 更多