使用词典展开数据框

时间:2016-04-26 05:37:31

标签: python dictionary pandas

我的数据框主要包含NaN,但某些条目中也包含字典。我的目标是将这些词典扩展到数据框的列,并将它们的条目保存在各自的索引上。 这是数据帧的一小部分。

                                                                       _id  _score 
query                                                        
chrM:g.146T>C                                                            NaN  NaN  
chrM:g.11723C>T                                                          NaN  NaN                                       NaN  NaN   
chrM:g.11813A>G                                                          NaN  NaN   
chrM:g.12140T>A                                                          NaN  NaN   
...                                                                      ...  ...     
chr1:g.11976370T>G         {u'ref': u'T', u'alleles': [{u'allele': u'T', ...  NaN   
chr1:g.12007164A>G                                                       NaN  NaN   
chr1:g.12007165A>G                                                       NaN  NaN 

到目前为止,我只是设法选择每个字典的键并添加以这些键命名的列:

s ={}
for cols in cols:
    if type(data1[cols].dropna()[0]) == type(s):
       cols_var = np.array(data1[cols].dropna()[0].keys())
       data1 = pandas.concat([data1,pandas.DataFrame(columns=cols_var)])

非常感谢任何关于如何以高效和可读的方式提供帮助或提示。

**编辑:**此代码:

y = pandas.Series((dbsnp.iloc[0]))
print y
然而,

检索一些有用的东西:

allele_origin                   unspecified
alleles                         [{u'allele': u'G'}, {u'allele': u'A'}]      
alt                              A
...                              ...
rsid                             rs201327123
vartype                          snp
dtype: object

我会尝试在这里工作,非常感谢其他输入。

1 个答案:

答案 0 :(得分:1)

为了将字典扩展为具有多列的数据框,您应该apply一个将字典作为pandas系列返回的函数。为此,您必须先删除NaN值。

让我们从一列开始:s = data1['_id'].dropna()。以下内容将返回由字典构成的扩展数据框:

expanded_df = s.apply(lambda row: pandas.Series(row))

这使用了将字典转换为系列的lambda(即内联)函数。您现在可以将展开的数据框与原始数据框合并:

pandas.concat([data1, expanded_df], axis=1)

concat函数将按索引匹配行,并为NaN中的缺失索引添加expanded_df值。方便的是,这些将是您在第一步中使用dropna删除的行。

现在,您可以对data1中的所有列执行此操作,方法是像最初一样迭代列,或者在apply上使用data1