我有一个pandas数据框,其中有一列包含字典,只有其中一些键是您感兴趣的。 我可以将dict列转换为另一个df,然后获取感兴趣的元素:
df = pd.DataFrame({'a':[{'x':1,'y':2},{'x':3,'y':4,'z':10}],'b':[5,6]})
cols_of_interest = ['x','z']
df_dicts = pd.DataFrame(df.a.tolist())
df_dicts = df_dicts[cols_of_interest]
如果字典很大,并且感兴趣的列稀疏,那么将函数应用于字典列会更好吗?这样,我可以避免生成一堆未使用的临时列。
答案 0 :(得分:0)
一种方法可以是 创建过滤器功能
def filter_keys(x,cols_of_interest):
new_dict={}
for keys in x:
if keys in cols_of_interest:
new_dict[keys]=x[keys]
return new_dict
并将相关键过滤为
cols_of_interest=['x','z']
df['c']=df['a'].apply(lambda x:filter_keys(x,cols_of_interest))
仅使用过滤的元素创建了一个新列c。
a b c
0 {'y': 2, 'x': 1} 5 {'x': 1}
1 {'y': 4, 'z': 10, 'x': 3} 6 {'z': 10, 'x': 3}
答案 1 :(得分:0)
一个想法是使用Series.str.get
提取与感兴趣的列关联的值,并从这些值中创建一个新的DataFrame
:
cols = ['x', 'z']
df1 = pd.DataFrame(df.a.str.get(col) for col in cols).T.set_axis(cols, 1)
结果:
# print(df1)
x z
0 1.0 NaN
1 3.0 10.0
答案 2 :(得分:0)
尝试:
(1).apply
:
df_dicts=df['a'].apply(pd.Series)[cols_of_interest]
输出:
x z
0 1.0 NaN
1 3.0 10.0
(2)或者使用.str
引荐来源网址:
df_dicts=pd.concat([df['a'].str[col] for col in cols_of_interest], axis=1)
df_dicts.columns=cols_of_interest
输出:
x z
0 1 NaN
1 3 10.0