从熊猫字典列中有效地提取数据

时间:2020-07-08 12:36:30

标签: python pandas

我有一个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]

如果字典很大,并且感兴趣的列稀疏,那么将函数应用于字典列会更好吗?这样,我可以避免生成一堆未使用的临时列。

3 个答案:

答案 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