我有一个这样的字典清单:
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进行少许修改)就可以使用
谢谢
答案 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
)。这会设置正确的Currency
和Product
值,但会给我们留下“错误的” Quantity
值。这将在字典理解的下一步中被覆盖。最后,设置Date
。从那里开始,只是熊猫连续读取每本词典。
答案 1 :(得分:1)
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