我应该如何在 Pandas 中减去两个数据帧并显示所需的输出?

Posted

技术标签:

【中文标题】我应该如何在 Pandas 中减去两个数据帧并显示所需的输出?【英文标题】:How should I subtract two dataframes and in Pandas and diplay the required output? 【发布时间】:2016-01-02 00:13:59 【问题描述】:

我的桌子是这样的:

In [82]:df.head()
Out[82]:
            MatDoc  MatYr  MvT  Material  Plnt  SLoc       Batch  Customer  AmountLC  Amount ...  PO  MatYr.1  MatDoc.1  Order   ProfitCtr    SLED/BBD   PstngDate   EntryDate      Time  Username
    0   4912693062   2015  551    100062  HDC2  0001  5G30MC1A11       NaN      9.03    9.06 ... NaN      NaN       NaN    NaN  IN1165B085  26.01.2016  01.08.2015  01.08.2015  01:13:16    O33462
    1   4912693063   2015  501       166  HDC2  0004         NaN       NaN      0.00    0.00 ... NaN      NaN       NaN    NaN  IN1165B085         NaN  01.08.2015  01.08.2015  01:13:17    O33462
    2   4912693320   2015  551    101343  HDC2  0001  5G28MC1A11       NaN     53.73   53.72 ... NaN      NaN       NaN    NaN  IN1165B085  25.01.2016  01.08.2015  01.08.2015  01:16:30    O33462

在这里,我需要按Order 列上的数据进行分组,并仅对AmountLC 列求和。然后我需要检查Order 列值,以便它应该同时出现在MvT101group 和@987654327 中@。如果Order 在两组数据中都匹配,那么我需要从MvT101group 中减去MvT102group。并显示

Order|Plnt|Material|Batch|Sum101=SumofMvt101ofAmountLC|Sum102=SumofMvt102ofAmountLC|(Sum101-Sum102)/100

我首先创建了只包含 101 和 102 的新 df:Mvt101MvT102

MvT101 = df.loc[df['MvT'] == 101]

MvT102 = df.loc[df['MvT'] == 102]

然后我将它按Order 分组,得到该列的总和值

MvT101group = MvT101.groupby('Order', sort=True)

In [76]:
MvT101group[['AmountLC']].sum()
Out[76]:
Order          AmountLC
1127828     16348566.88
1127829     22237710.38
1127830     29803745.65
1127831     30621381.06
1127832     33926352.51

MvT102group = MvT102.groupby('Order', sort=True)

In [77]:
MvT102group[['AmountLC']].sum()
Out[77]:
Order         AmountLC
1127830       53221.70
1127831      651475.13
1127834       67442.16
1127835     2477494.17
1128622      218743.14

在此之后,我无法理解我应该如何编写查询。 如果需要,请向我询问更多详细信息。这是我工作的 CSV 文件Link

【问题讨论】:

【参考方案1】:

希望我正确理解了这个问题。像你一样对两组进行分组后:

MvT101group = MvT101.groupby('Order',sort=True).sum()
MvT102group = MvT102.groupby('Order',sort=True).sum()

您可以更新两个组的列名:

MvT101group.columns = MvT101group.columns.map(lambda x: str(x) + '_101')
MvT102group.columns = MvT102group.columns.map(lambda x: str(x) + '_102')

然后合并所有 3 个表,这样您将在主表中拥有所有 3 列:

df = df.merge(MvT101group, left_on=['Order'], right_index=True, how='left')
df = df.merge(MvT102group, left_on=['Order'], right_index=True, how='left')

然后你可以添加计算列:

df['calc'] = (df['Order_101']-df['Order_102']) / 100

【讨论】:

以上是关于我应该如何在 Pandas 中减去两个数据帧并显示所需的输出?的主要内容,如果未能解决你的问题,请参考以下文章

Pandas循环遍历数据帧并使用while循环列表

如何在 Scala 中连接两个数据帧并通过索引从数据帧中选择几列?

如何从 Pandas 数据框列中的日期时间减去 3 小时?

循环遍历 Pandas 数据帧并根据条件复制到新数据帧

在多个时间范围内聚合/重采样 pandas 多索引数据帧并预测 ARIMA

如何将数据读取到 dask 数据帧并删除坏行