датафрейм из словаря словаря в списке - PullRequest
2 голосов
/ 07 октября 2019

У меня есть список словаря, подобный этому:

my_list = [
    {
        'Currency': 'USD',
        'Product': 'a',
        'Quantity': {
            'Apr 2019': 1.0,
            'Jun 2019': 7.0
        }
    },
    {
        'Currency': 'USD',
        'Product': 'b',
        'Quantity': {
            'Jan 2019': 4.0,
            'Feb 2019': 8.0
        }
    }
]

И я хочу такой кадр данных:

 Currency Product Quantity  Date
 'USD'      'a'      1      Apr 2019
 'USD'      'a'      7      Jun 2019
 'USD'      'b'      4      Jan 2019
 'USD'      'b'      8      Feb 2019

В настоящее время я делаю это:

for element in my_list :
     currency = element.get('Currency')
     product = element.get('Product')
     dates = list(element.get('Quantity').keys())
     for date in dates:
         quantity = element.get('Quantity')[date]
         row = [currency, product, quantity, date]
         df.loc[df.shape[0]] = row

Но я полагаю, что вместо цикла в списке есть лучший способ, и

pd.DataFrame.from_dict(my_list)

работает, если есть только одно значение в количестве (с небольшой модификацией с .apply)

спасибо

Ответы [ 3 ]

2 голосов
/ 07 октября 2019
df_dict = [{**d, "Quantity": quantity, "Date": date,} for d in my_list for date, quantity in d['Quantity'].items()]

df = pd.DataFrame.from_dict(df_dict)

output :

>>> df

Currency    Product Quantity    Date
0   USD         a       1.0         Apr 2019
1   USD         a       7.0         Jun 2019
2   USD         b       4.0         Jan 2019
3   USD         b       8.0         Feb 2019

Объяснение :

Используя двойной вложенный цикл, вы перечисляете свой список поколичество пар количество / дата - то, что вы хотите. Затем вы распаковываете словарь на первом уровне (используя **d). Это устанавливает правильные значения Currency и Product, но оставляет нам «плохое» значение Quantity. Это перезаписывается на следующем шаге понимания словаря. И, наконец, Date установлено. Оттуда просто панды читают каждый словарь как строку.

1 голос
/ 07 октября 2019

Вы можете использовать двойной цикл для обработки ваших данных.

Следующий код

df = pd.DataFrame(
    [
        {
            'Currency': item.get('Currency'),
            'Product': item.get('Product'),
            'Date': quant_key,
            'Quantity': quant_val,
        } for item in my_list for quant_key, quant_val in item['Quantity'].items()
    ]
)
print(df)

возвращает этот вывод:

  Currency Product      Date  Quantity
0      USD       a  Apr 2019       1.0
1      USD       a  Jun 2019       7.0
2      USD       b  Jan 2019       4.0
3      USD       b  Feb 2019       8.0
1 голос
/ 07 октября 2019

Использование json_normalize :

from pandas.io.json import json_normalize
df=json_normalize(my_list,'Quantity',['Currency','Product'])
Quantity=[]
for d in my_list:
    for month in  d['Quantity']:
        Quantity.append(d['Quantity'][month])
df['Quantity']=Quantity
df=df.rename(columns={0:'Date'}).reindex(columns=['Currency','Product','Quantity','Date'])
print(df)


  Currency Product  Quantity      Date
0      USD       a       1.0  Apr 2019
1      USD       a       7.0  Jun 2019
2      USD       b       4.0  Jan 2019
3      USD       b       8.0  Feb 2019
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...