python - 比较两个或三个数据帧中的列值并合并

标签 python pandas dataframe pandas-groupby

我已经检查了一些之前的问题,并且有一些独特的问题。 我有三个 Excel 文件,我将它们加载到三个不同的数据框中。 基本上我必须添加 excel_1 和 excel_2 的内容并将内容与 excel_3 进行比较

示例数据:(excel_1 sales Territory#1)

  Name  Year    Item    sales_Amount1
  A1        1.2019  Badam   2
  A1        1.2019  Badam   10
  A1        1.2019  carrot  8
  A1        1.2019  carrot  10
  A2        1.2019  Badam   10
  A2        1.2019  Badam   20
  A3        2.2019  soap    3
  A1        2.2019  soap    1

示例数据:(excel_2 sales Territory#2)

  Name  Year    Item    sales_Amount2
  A1        1.2019  Badam   60
  A1        1.2019  Badam   10
  A2        1.2019  Badam   40
  A2        1.2019  Badam   1
  A3        2.2019  soap    1
  A3        2.2019  soap    10
  A1        2.2019  soap    10

excel_3目标也有类似的数据

  Name  Year    Item    target_Amount
  A1        1.2019  Badam   100
  A2        1.2019  Badam   30
  A1        1.2019  carrot  200
  A3        2.2019  soap    3

基本上,我必须添加销售额 1 和 2,并将结果与​​目标数据进行比较。我想要一个包含列详细信息如下的 csv。因此我可以像我提到的那样进行计算。

  Name   Year    Item   sales_Amount1  Sales_Amount2  target_Amount
  A1     1.2019  Badam  12              70             100
  A1     1.2019  carrot 18              0              200
  A2     1.2019  Badam  30              41             30
  A1     2.2019  soap   1               10             0
  A3     2.1019  soap   3               11             3
df1 = pd.read_excel(r"excel_1.xlxs")
sum_sales1 = df1.groupby(['Name','Year', 'Item']).agg({'sales_Amount1': 'sum'})

df2 = pd.read_excel(r"excel_2.xlxs")
sum_sales1 = df2.groupby(['Name','Year', 'Item']).agg({'sales_Amount2': 'sum'})

df3 = pd.read_excel(r"excel_3.xlxs")
sum_sales1 = df3.groupby(['Name','Year', 'Item']).agg({'target_Amount': 'sum'})

基本上,我将每个 csv 加载到一个数据框中,然后进行 groupby 以获得每个项目的聚合总和,如上所示。 现在将如上所示的所有三个数据帧与以下列进行比较和合并有点棘手

Name   Year    Item   sales_Amount1  Sales_Amount2  target_Amount

这种方法是否适合比较三个数据帧并将它们合并为一个数据帧,或者我应该转向数据透视表。在我继续之前,选择哪一个有点令人困惑。谢谢。

最佳答案

使用concatDataFrame.fillna :

sum_sales1 = df1.groupby(['Name','Year', 'Item']).agg({'sales_Amount1': 'sum'})
sum_sales2 = df2.groupby(['Name','Year', 'Item']).agg({'sales_Amount2': 'sum'})
sum_sales3 = df3.groupby(['Name','Year', 'Item']).agg({'target_Amount': 'sum'})

df = (pd.concat([sum_sales1, sum_sales2, sum_sales3],
        axis=1).fillna(0).astype(int).reset_index())
print (df)
  Name    Year    Item  sales_Amount1  sales_Amount2  target_Amount
0   A1  1.2019   Badam             12             70            100
1   A1  1.2019  carrot             18              0            200
2   A1  2.2019    soap              1             10              0
3   A2  1.2019   Badam             30             41             30
4   A3  2.2019    soap              3             11              3

如果最后一列需要聚合 - 则使用列表理解:

dfs = [df1, df2, df3]
dfs = [x.groupby(['Name','Year', 'Item']).agg({x.columns[-1]: 'sum'}) for x in dfs]

df = pd.concat(dfs, axis=1).fillna(0).astype(int).reset_index()
print (df)
  Name    Year    Item  sales_Amount1  sales_Amount2  target_Amount
0   A1  1.2019   Badam             12             70            100
1   A1  1.2019  carrot             18              0            200
2   A1  2.2019    soap              1             10              0
3   A2  1.2019   Badam             30             41             30
4   A3  2.2019    soap              3             11              3

关于python - 比较两个或三个数据帧中的列值并合并,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58603076/

相关文章:

Python - Pandas - 展开/删除累计和

python - 高效方式 : find row where nearly no zero appears in column

python-2.7 - 截断 pandas DataFrame 的行

python - 单元测试实现 Python 属性

python - Matplotlib 表格格式化列宽

python - 获取购买次数最多的前 10 件商品作为列表

python - 如何组合数据框的月份和年份列以形成时间序列数据

python - 按一列或另一列对 pandas 数据框进行分组

python - 如何连接来自 3 个小整数的字节以生成由 Python 中的这些字节表示的更大数字?

python - 设置 Pyramid 以使用 MySQL raw 而不是 SQLAlchemy