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