Pandas-基于不在序列中的特定键值从数据帧中提取值

Pandas-基于不在序列中的特定键值从数据帧中提取值,pandas,Pandas,我有以下格式的数据帧: id, ref 101, [{'id': '74947', 'type': {'id': '104', 'name': 'Sales', 'inward': 'Sales', 'outward': 'PO'}, 'inwardIssue': {'id': '76560', 'key': 'Prod-A'}}] 102, [{'id': '74948', 'type': {'id': '105', 'name': 'Return', 'inward': 'Return Or

我有以下格式的数据帧:

id, ref
101, [{'id': '74947', 'type': {'id': '104', 'name': 'Sales', 'inward': 'Sales', 'outward': 'PO'}, 'inwardIssue': {'id': '76560', 'key': 'Prod-A'}}]
102, [{'id': '74948', 'type': {'id': '105', 'name': 'Return', 'inward': 'Return Order', 'outward': 'PO'}, 'inwardIssue': {'id': '76560', 'key': 'Prod-C'}}, 
      {'id': '750001', 'type': {'id': '342', 'name': 'Sales', 'inward': 'Sales', 'outward': 'PO'}, 'inwardIssue': {'id': '76560', 'key': 'Prod-X'}}]
103, [{'id': '74949', 'type': {'id': '106', 'name': 'Sales', 'inward': 'Return Order', 'outward': 'PO'}, 'inwardIssue': {'id': '76560', 'key': 'Prod-B'}},
104, [{'id': '67543', 'type': {'id': '106', 'name': 'Other', 'inward': 'Return Order', 'outward': 'PO'}, 'inwardIssue': {'id': '76560', 'key': 'Prod-BA'}}]
我试图提取name=Sales的行,并返回以下输出:

101, Prod-A
102, Prod-X
103, Prod-B
如果键值对出现在第一个实例中,我可以提取所需的数据,但如果它不是第一个实例,我就无法提取所需的数据,就像在id=102的情况下一样

df['names'] = df['ref'].str[0].str.get('type').str.get('name')
df['value'] = df['ref'].str[0].str.get('inwardIssue').str.get('key')
df['output'] = np.where(df['names'] == 'Sales', df['value'], 0)
目前我只能得到id=101103的值,让我们来爆炸吧

让我们爆炸吧


如果已经有了该格式的数据帧,可以将其转换为json格式,并使用pd.json_normalize将原始df转换为平面数据帧,并在此平面数据帧上进行切片/文件化

df1 = pd.json_normalize(df.to_dict(orient='records'), 'ref')
此平面数据帧df1的输出

最后,在df1上进行切片


如果已经有了该格式的数据帧,可以将其转换为json格式,并使用pd.json_normalize将原始df转换为平面数据帧,并在此平面数据帧上进行切片/文件化

df1 = pd.json_normalize(df.to_dict(orient='records'), 'ref')
此平面数据帧df1的输出

最后,在df1上进行切片

Out[83]:
       id type.id type.name   type.inward type.outward inwardIssue.id  \
0   74947     104     Sales         Sales           PO          76560
1   74948     105    Return  Return Order           PO          76560
2  750001     342     Sales         Sales           PO          76560
3   74949     106     Sales  Return Order           PO          76560
4   67543     106     Other  Return Order           PO          76560

  inwardIssue.key
0          Prod-A
1          Prod-C
2          Prod-X
3          Prod-B
4         Prod-BA
df_final = df1.loc[df1['type.name'].eq('Sales'), ['type.id', 'inwardIssue.key']]

Out[88]:
  type.id inwardIssue.key
0     104          Prod-A
2     342          Prod-X
3     106          Prod-B