【问题标题】:how to speed up code to get data from a list of dictionaries如何加快代码从字典列表中获取数据
【发布时间】:2020-12-29 21:18:43
【问题描述】:

我有一个数据框,其中 id 和 date 作为索引,ShopData 作为列,如下所示: shopdata

如您所见,有一个以“ValueType”和“Value”为键的字典列表。这个想法是如果“ValueType”等于“coffee”,则提取“Value”键下的数据。然后我需要数据来做一些计算。

我下面的代码可以运行,但速度很慢:

ids = data.index.get_level_values(0)
df = pd.DataFrame(float(0),index = ids , columns=['coffeedata'] )

for i in range(len(ids)):
    for item in data.loc[ids[i], 'ShopData'][0] :
        if item["ValueType"] == 'coffee':
            df.iloc[i]['coffeedata']=  float(item['Value'] )

瓶颈在哪里,知道如何让代码运行得更快吗?谢谢!

【问题讨论】:

  • 阅读:How to Ask
  • 能否请您使您正在使用的数据框可重现?

标签: python pandas list dictionary


【解决方案1】:

试试这个:

data['ShopData'].apply(lambda x: [i['value'] for i in x if i["ValueType"]=='coffee'])

当 ValueType 为咖啡时,它会创建一个包含包含值的列表的列

【讨论】:

    【解决方案2】:

    运行:

    df = data.ShopData.reset_index(level=1, drop=True).apply(
        lambda sd: [ dct['Value'] for dct in sd if dct['ValueType'] == 'coffee'][0] )\
        .astype(float).rename('coffeedata').to_frame()
    

    我测试了 4000 行样本的执行时间(使用 %timeit)。 您的代码在 5.11 秒 内执行,而我在 5.42 毫秒 内执行(快 940 倍)。

    【讨论】:

    • 比我原来的解决方案快得多。谢谢。
    猜你喜欢
    • 2023-01-24
    • 2020-03-26
    • 1970-01-01
    • 1970-01-01
    • 2022-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-25
    相关资源
    最近更新 更多