2016-04-26 69 views
1

我有一個主要包含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

你能顯示完整的字典嗎?它看起來像嵌套。你想如何精確地擴展它? – IanS

+0

你是對的。它是嵌套的,其他列也可以包含嵌套字典。以下是特定的一個: '{u'ref':u'G',u'alleles':[{u'allele':u'G'},{u'allele':u'A'} ],u'var_subtype':u'ts',u'allele_origin':u'unspecified',u'dbsnp_build':137,u'rsid':u'rs201327123',u'flags':[u'ASP', u'hg19':{u'stg':14677,u'end':14678},u'alt':u'A',u'validated':True,u'chrom':u '1',u'class':u'SNV',u'vartype':u'snp'}' –

+0

您可以檢查我的解決方案並查看它是否適用於您? – IanS

回答

1

爲了將字典擴展爲多列數據框,您應該使用apply函數將字典作爲熊貓系列返回。爲此,您必須先刪除NaN值。

讓我們從一列開始:s = data1['_id'].dropna()。下面將返回從字典由膨脹數據幀:

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

這使得使用的λ(即內聯)函數,其將所述詞典成一系列。現在,您可以與原來的合併擴展數據幀:

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

concat功能將通過指數匹配的行,並把NaN值失蹤指數在expanded_df。方便的是,這些將恰恰是您在第一步中用dropna刪除的行。

您現在可以通過在列上迭代像最初一樣的方式對data1中的所有列執行此操作,或使用data1上的apply執行此操作。

+0

它的工作!只有幾個細節:嵌套字典仍然是字典;所以我認爲我可以在識別它們之後再運行一次這樣的功能。最後,我看到包含字典的列仍然存在,所以我只需要刪除它們。但除此之外,看起來不錯。謝謝。 –

+0

是的,我害怕重複這個過程是處理嵌套字典的唯一方法。不管是那個還是在lambda函數內部處理它們。我今天晚些時候可以試試... – IanS

+0

當然。我昨天嘗試了投票,但我無法這樣做,因爲我仍然需要達到15點聲望xD。我也會嘗試重複這個方法,會讓你回來。再次感謝。 –