【问题标题】:Dataframes in Python - matching multiple columns of rows between two data framesPython中的数据框 - 匹配两个数据框之间的多列行
【发布时间】:2018-02-11 14:44:31
【问题描述】:

我有两个数据框 df1 - 它包含按数值 A、B 和 C 分组的项目的“分组库存”。对于每个项目都有一个总和列,它应该反映我拥有的所有项目的总价格那个特定的类型。最初我将 sum 列设置为零。

df2 是我拥有的 A、B、C 和项目价格的项目列表。

df1(初始库存):

A     B     C   SUM
1     1     1    0
1     1     2    0
1     2     2    0
2     2     2    0

df2(项目列表):

A     B     C   PRICE
2     2     2    30
1     1     2    100
1     1     2    110
1     1     2    105

所以我的代码应该将 df1 转换为:

df1(预期输出):

A     B     C   SUM
1     1     1    0
1     1     2    315
1     2     2    0
2     2     2    30

解释: 我的项目列表 (df2) 包含一个编码为 2,2,2 的项目,其值为 30,并包含三个编码为 1,1,2 的项目,其值为100 + 110 + 105 = 315。所以我更新了库存表 df1,以反映我对编码为 2、2、2 的项目的总值为 30,而对编码为 1、1、2 的项目的总值为 315。对于编码为 1,1,1 和 1,2,2 的项目,我的值为 0 - 因为在我的项目列表中找不到它们。

最有效的方法是什么?

我宁愿不使用循环,因为 df1 是 720 行,而 df2 是 10,000 行。

【问题讨论】:

  • 您能详细解释一下您是如何得出这个结果的吗?
  • @Tai Sure。我的项目列表 (df2) 包含一个编码为 2,2,2 的项目,其值为 30,并包含三个编码为 1,1,2 的项目,其值为 100 + 110 + 105 = 315。所以我更新了库存表 df1,以反映我对编码为 2、2、2 的项目的总值为 30,而对编码为 1、1、2 的项目的总值为 315。对于编码为 1,1,1 和 1,2,2 的项目,我的值为 0 - 因为在我的项目列表中找不到它们。
  • 请通过编辑您的问题提供更多信息。人们往往不阅读 cmets。

标签: python dataframe


【解决方案1】:

您可以尝试使用how="left" 在“A”、“B”和“C”列上merge。 (下面的df2_sumdf1的一个子集,所以我们这里选择left。)

df2_sum = df2.groupby(["A", "B", "C"])["PRICE"].sum().reset_index()

df1.merge(df2_sum, on=["A","B","C"], how="left").fillna(0)
    A   B   C   SUM PRICE
0   1   1   1   0   0.0
1   1   1   2   0   315.0
2   1   2   2   0   0.0
3   2   2   2   0   30.0

然后您可以将PRICE 添加到您的SUM 列中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-02
    • 2019-06-20
    • 2020-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-23
    相关资源
    最近更新 更多