在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
我的解决方案基于使用
update
高效地更新 选择(例如公司1)。你知道吗但是要使用
update
,应该有一个序列,其键等于特定的 键(索引值)在df中,而您的所有词典的键都相等 到子产品值,对于特定的产品。你知道吗因此,成功的关键是“翻译”:
要有效地执行此操作,请从为df创建反向索引开始:
这样做的目的是让产品/子产品配对,您可以快速 获取df中相关行的索引(执行测向位置[…]要慢得多)。你知道吗
要检查它是如何工作的,运行
revInd[('a', '1')]
,您将得到0- 包含product=='a'和subproduct='1'的行的索引 (我假设这两列都是string类型)。你知道吗然后定义更新函数:
参数:
此函数根据字典理解生成upd系列, 从产品/子产品对执行转码 (来自字典键的子管道),到df中相关行的索引。 值不会更改。你知道吗
然后,基于upd,更新df中的相关列。 此更新发生在适当的位置,因此不需要返回任何结果。你知道吗
要检查我的解决方案,请创建“更新”词典:
(d1和d2对于公司1和d3对于公司2)。你知道吗
然后运行:
如果您打印df,您将得到:
就像它应该的那样。你知道吗
出于演示目的,请在第一次和第二次打印后运行打印(df) 调用updCol。你知道吗
当然,我无法复制你应该做的全部任务。 我只演示了如何在示例数据上使用上述函数。你知道吗
所以现在您的任务是将我的解决方案合并到您的代码中。你知道吗
相关问题 更多 >
编程相关推荐