如何有效地将字典中的数据添加到数据帧?

2024-05-19 00:22:12 发布

您现在位置:Python中文网/ 问答频道 /正文

在for循环中,我使用从函数返回的字典填充数据帧。也许我没有用正确的术语进行搜索,或者我解决这个问题的方法是错误的,但是我还没有在网上找到一个适用的解决方案。我觉得我现在这样做效率很低。你知道吗

我对Pandas相当缺乏经验-我尝试过一些尝试,试图使用merge方法,以及concat、append和remove\ u的一些组合,但是我还没有完全掌握我想要的。你知道吗

我目前的解决方案是迭代字典项:

for company in Company.instances:
    for resource in company.resources:
        for product in resource["product"]:
            my_dictionary = my_function("with varying args per company/product")

            # Remove None values from my_dictionary
            my_dictionary = {k: v for k, v in my_dictionary.copy().items() if v is not None}

            # TODO speed this up
            if len(my_dictionary) > 0:
                df = Company.products[product]["current"]
                for subproduct, value in my_dictionary.items():
                    df.loc[
                        (df["product"] == product) &
                        (df["subproduct"] == subproduct),
                        company.name
                    ] = value

注意事项:

位于Company.products[product]["current"]的Company类中的每个数据帧都使用以下格式的每个数据帧的一个产品进行初始化:

        product     subproduct  company1    company2
0       a           1
1       a           2
2       a           3
3       a           4
4       a           5

字典键引用子管道列。数据框中的每个公司列可能有两个或多个字典-例如:

"""
if my_function returns this dict for company1:
{'1': 'alpha', '2': 'bravo', '3': 'charlie'}

desired:
        product     subproduct  company1    company2
0       a           1           alpha
1       a           2           bravo
2       a           3           charlie       
3       a           4                       
4       a           5

followed by this dict also for company1:
{'1': 'november', '5': 'echo'}

desired:
        product     subproduct  company1    company2
0       a           1           november
1       a           2           bravo
2       a           3           charlie       
3       a           4                       
4       a           5           echo

and this dict for company2:
{'4': 'kilo', '2': 'foxtrot'}

desired:
        product     subproduct  company1    company2
0       a           1           november
1       a           2           bravo       foxtrot
2       a           3           charlie       
3       a           4                       kilo
4       a           5           echo

"""

感谢您花时间阅读,如果您想节省一两分钟的时间重新创建数据帧结构并复制dicts,这里有一个pastebin:https://pastebin.com/raw/KkF77LCG


Tags: 数据indffordictionary字典myproduct
1条回答
网友
1楼 · 发布于 2024-05-19 00:22:12

我的解决方案基于使用update高效地更新 选择(例如公司1)。你知道吗

但是要使用update,应该有一个序列,其键等于特定的 键(索引值)在df中,而您的所有词典的键都相等 到子产品值,对于特定的产品。你知道吗

因此,成功的关键是“翻译”:

  • 产品/子产品
  • 索引值。你知道吗

要有效地执行此操作,请从为df创建反向索引开始:

revInd = df.reset_index().set_index(['product', 'subproduct'])['index']

这样做的目的是让产品/子产品配对,您可以快速 获取df中相关行的索引(执行测向位置[…]要慢得多)。你知道吗

要检查它是如何工作的,运行revInd[('a', '1')],您将得到0- 包含product=='a'subproduct='1'的行的索引 (我假设这两列都是string类型)。你知道吗

然后定义更新函数:

def updCol(df, revInd, prodName, colName, dct):
    upd = pd.Series({ revInd[(prodName, k)]: v for k, v in dct.items() })
    df[colName].update(upd)

参数:

  • df-要更新的数据帧。你知道吗
  • revInd-反向索引。你知道吗
  • prodName—产品名称(选择标准的一部分)。你知道吗
  • colName-要更新的列名。你知道吗
  • dct-源字典。你知道吗

此函数根据字典理解生成upd系列, 从产品/子产品对执行转码 (来自字典键的子管道),到df中相关行的索引。 值不会更改。你知道吗

然后,基于upd,更新df中的相关列。 此更新发生在适当的位置,因此不需要返回任何结果。你知道吗

要检查我的解决方案,请创建“更新”词典:

d1 = {'1': 'alpha', '2': 'bravo', '3': 'charlie'}
d2 = {'1': 'november', '5': 'echo'}
d3 = {'4': 'kilo', '2': 'foxtrot'}

d1d2对于公司1d3对于公司2)。你知道吗

然后运行:

updCol(df, revInd, 'a', 'company1', d1)
updCol(df, revInd, 'a', 'company1', d2)
updCol(df, revInd, 'a', 'company2', d3)

如果您打印df,您将得到:

  product subproduct  company1 company2
0       a          1  november         
1       a          2     bravo  foxtrot
2       a          3   charlie         
3       a          4               kilo
4       a          5      echo         

就像它应该的那样。你知道吗

出于演示目的,请在第一次和第二次打印后运行打印(df) 调用updCol。你知道吗

当然,我无法复制你应该做的全部任务。 我只演示了如何在示例数据上使用上述函数。你知道吗

所以现在您的任务是将我的解决方案合并到您的代码中。你知道吗

相关问题 更多 >

    热门问题