从Pandas数据框列中包含的列表中提取字典值

时间:2020-06-04 13:11:26

标签: pandas

我正在尝试从Pandas数据框中的列表中包含的字典中提取值。目标是将id键拆分为多列。样本数据如下:

Column_Header
[{'id': '498', 'relTypeId': 2'},{'id': '499', 'relTypeId': 3'}]
[{'id': '499', 'relTypeId': 3'},{'id': '500', 'relTypeId': 4'},{'id': '501', 'relTypeId': 5'}]

我尝试过如下

list(map(lambda x: x["id"], df["Column_Header"]))

但是出现如下错误: “列表索引必须是整数或切片,而不是str”。所需的o / p是:

col1|col2|col3
498 |499 |
499 |500 |501

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:1)

我们可以先做explode,然后用cumcount创建另一个键,然后旋转

s=df.Column_Header.explode().str['id']
s=pd.crosstab(index=s.index,columns=s.groupby(level=0).cumcount(),values=s,aggfunc='sum')
Out[133]: 
col_0    0    1    2
row_0               
0      498  499  NaN
1      499  500  501

答案 1 :(得分:0)

如果性能很重要,请在字典键中的选择id中使用嵌套列表推导:

df = pd.DataFrame([[y['id'] for y in x] for x in df['Column_Header']], index=df.index)
print (df)
     0    1     2
0  498  499  None
1  499  500   501

如果可能的话,使用一些缺少的值:

L = [[y['id'] for y in x] if  isinstance(x, list) else [None] for x in df['Column_Header']]
df = pd.DataFrame(L, index=df.index)