我的数据框主要包含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
我会尝试在这里工作,非常感谢其他输入。
答案 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
。