2017-02-22 10 views
1

В настоящее время у меня есть список кортежей с двумя элементами, строка и словарь из трех пар ключ-значение.Как преобразовать список словарей внутри кортежа в табличные данные/pandas DataFrame?

list1 = [("string1", {"a": 1, "b": 2, "c": 3}), 
     ("string2", {"a": 11, "b": 21, "c": 31}), ...] 

Это беспорядок. Я хотел бы поставить это DataFrame format.The предназначен формат должен быть

strings a b c 
string1 1 2 3 
string2 11 21 31 

Как положить экстракт это в DataFrame как формат? Для первых элементов в кортеже, я подозреваю, что мы бы распаковывать строки следующим образом:

import pandas as pd 
for i in list1: 
    df = pd.DataFrame() 
    df["strings"] = pd.DataFrame([list1[i][0]]) # create the `strings` column 
    # place the 2nd element of the tuple in a DataFrame, and then merge with `df` 
    df = df.merge(df, pd.DataFrame(list1[0][i])) 

Это, конечно, не работает.

TypeError: list indices must be integers, not tuple 

Хотите, чтобы лучший способ превратить исходную структуру данных в табличный формат?

ответ

1

Вы можете сделать это следующим образом:

list1 = [("string1", {"a": 1, "b": 2, "c": 3}), 
     ("string2", {"a": 11, "b": 21, "c": 31})] 

df = pd.DataFrame([row[1] for row in list1]) # create df from list of dicts 
df["strings"] = [row[0] for row in list1] # add the string column 

и при необходимости вы можете добавить:

df.set_index("strings", inplace=True) 
0

Другой вариант, вы можете конвертировать список в словаре, а затем использовать pd.DataFrame.from_dict:

pd.DataFrame.from_dict(dict(list1), orient="index").rename_axis("strings").reset_index() 

# strings  b a c 
#0 string1  2 1 3 
#1 string2 21 11 31