列表中字典的数据帧

问题描述 投票:2回答:3

我有这样的字典清单:

    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进行一点修改),则可以使用

感谢

python pandas list dataframe dictionary
3个回答
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
投票

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

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
© www.soinside.com 2019 - 2024. All rights reserved.