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 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 = 101, 103的值

让我们做explode

s=pd.DataFrame(df.ref.explode().tolist())
s=s.loc[s.type.str.get('name').eq('Sales'),'inwardIssue'].str.get('key')
dfs=df.join(s,how='right')
id                                                ref inwardIssue
0  101  [{'id': '74947', 'type': {'id': '104', 'name':...      Prod-A
2  103  [{'id': '74949', 'type': {'id': '106', 'name':...      Prod-X
3  104  [{'id': '67543', 'type': {'id': '106', 'name':...      Prod-B

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

df1 = pd.json_normalize(df.to_dict(orient='records'), 'ref')

该平面数据帧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

最后,对df1进行切片

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

最新更新