2016-04-26 3 views
1

У меня есть dataframe, который содержит в основном NaN, но также словари в определенных записях. Моя цель - расширить эти словари до столбцов кадра данных и сохранить их записи по их соответствующим индексам. Это то, на что похожа небольшая часть данных.Развернуть dataframe со словарями

                 _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 

До сих пор, я только что удалось подобрать ключи каждого Dict и добавить столбцы, названные с этими ключами:

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)]) 

Любая помощь или советы о том, как сделать это в эффективной и читаемый будет высоко оценен.

** EDIT: ** этот код:

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'R3 '], u'hg19': {u'start ': 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 функцию, которая возвращает словарь в виде серии pandas. Для этого сначала необходимо удалить значения NaN.

Начнем с отдельной колонки: s = data1['_id'].dropna(). Ниже будет возвращать расширенный dataframe сделанный из словарей:

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

Это делает использование лямбда-функции (т.е. встроенный), который преобразует словарь в серию. Теперь вы можете объединить расширенную dataframe с исходной:

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

concat функция будет соответствовать строки по индексу, и положить NaN значения для отсутствующих индексов в expanded_df. Удобно, что это будут именно те строки, которые вы удалили с dropna на первом этапе.

Теперь вы можете сделать это для всех столбцов в data1 путем итерации по столбцам, как вы делали первоначально, или с помощью apply по адресу data1.

+0

Это сработало!Всего несколько деталей: вложенные словари все еще оставались словарями; поэтому я думаю, что я могу запустить еще один запуск такой функции после их идентификации. Наконец, я вижу, что столбцы, содержащие содержащиеся в нем слова, все еще существуют, поэтому я должен их просто отбросить. Но кроме того, хорошо выглядит. Спасибо. –

+0

Да, я боюсь, что повторение процедуры - единственный способ справиться с вложенными словарями. Либо это, либо иметь дело с ними внутри лямбда-функции. Сегодня я могу попробовать ... – IanS

+0

Определенно. Я пробовал это вчера, но я не могу этого сделать, так как я до сих пор должен достичь 15 баллов репутации xD. Я также попробую повторить метод, вернет вас. Еще раз спасибо. –

Смежные вопросы