列表中字典的字典中的数据框

时间:2019-10-07 15:37:51

标签: python pandas list dataframe dictionary

我有一个这样的字典清单:

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 个答案:

答案 0 :(得分:2)

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)

输出

>>> 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)。这会设置正确的CurrencyProduct值,但会给我们留下“错误的” Quantity值。这将在字典理解的下一步中被覆盖。最后,设置Date。从那里开始,只是熊猫连续读取每本词典。

答案 1 :(得分:1)

使用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

答案 2 :(得分:1)

您可以使用双循环处理数据。

以下代码

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