如何根据另一个DataFrame中的值更新DataFrame中的值?

时间:2014-11-06 20:10:33

标签: python pandas dataframe

假设我有以下DataFrames:

容器:

Key ContainerCode       Quantity
1   P-A1-2097-05-B01    0
2   P-A1-1073-13-B04    0
3   P-A1-2024-09-H05    0
5   P-A1-2018-08-C05    0
6   P-A1-2089-03-C08    0
7   P-A1-3033-16-H07    0
8   P-A1-3035-18-C02    0
9   P-A1-4008-09-G01    0

清单:

Key SKU     ContainerCode       Quantity
1   22-3-1  P-A1-4008-09-G01    1
2   2132-12 P-A1-3033-16-H07    55
3   222-12  P-A1-4008-09-G01    3
4   4561-3  P-A1-3083-12-H01    126

如何根据清单中的信息更新容器中的数量值以反映每个容器中的单位数?请注意,多个SKU可以驻留在单个ContainerCode中,因此我们需要添加数量,而不是仅替换它,并且Container中可能有多个条目用于特定的ContainerCode。

实现这一目标的可行方法有哪些,它们的相对优缺点是什么?

修改

以下代码似乎是一个很好的测试用例:

import itertools
import pandas as pd
import numpy as np

inventory = pd.DataFrame({'Container Code':['A1','A2','A2','A4'],
                               'Quantity':[10,87,2,44],
                               'SKU':['123-456','234-567','345-678','456-567']})

containers = pd.DataFrame({'Container Code':['A1','A2','A3','A4'],
                               'Quantity':[2,0,8,4],
                               'Path Order':[1,2,3,4]})

summedInventory = inventory.groupby('Container Code')['Quantity'].sum()

print('Containers Data Frame')
print(containers)
print('\nInventory Data Frame')
print(inventory)
print('\nSummed Inventory List')
print(summedInventory)
print('\n')

newContainers = containers.drop('Quantity', axis=1). \
     join(inventory.groupby('Container Code').sum(), on='Container Code')
print(newContainers)

这似乎产生了所需的输出。

我也尝试过使用常规合并:

pd.merge(containers.drop('Quantity', axis=1), \
    summedInventory,how='inner',left_on='Container Code', right_index=True)

但是这会产生'IndexError:list index out of range'

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

我希望我的方案正确无误。我想你可以使用:

containers.drop('Quantity', axis = 1).\
           join(inventory.groupby('ContainerCode').sum(), \
                on = 'ContainerCode')
  1. 我首先从容器中删除数量,因为您不需要它 - 我们会从库存中创建它。
  2. 然后,我们按照容器代码按库存进行分组,以总计与每个容器相关的数量。
  3. 然后我们执行两者之间的连接,并且容器中存在的每个容器代码将从库存中接收总计数量