numpy 如何将求和的结果近似为列的值?

qeeaahzv  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(116)

我有以下 Dataframe :

data = {'id':[xxx, xxy, xxz, xyx, xzy],
        'Total_I':[4796.6, 170637.53, 782.64, 449.12, 25654.02],
        'SumImp_RP':[3658.75, 0, 0, 0, 21530.45],
        'Total_E':[1137.84, 170637.56, 1565.26, 449.11, 8501.18],
        'Egre_E':[980.9, 130901.29, 674.69, 387.17, 1532.76],
        'ImpEgre_E':[156.94, 20944.27, 107.94000000000001, 61.94, 245.24],
        'Desc_E':[1137.84, 151845.56, 782.63, 449.11, 1778], 
}
df = pd.DataFrame(data)

字符串
通过下面的代码,我获得了余额和balance 2。

dfLim[["Desc_E", "Total_E", "Total_I", "SumImp_RP"]] = dfLim[["Desc_E", "Total_E", "Total_I", "SumImp_RP"]].astype(float)

dfLim['SalIns2'] = dfLim.loc[(dfLim.Desc_E< dfLim.Total_E)                                   & dfLim.TotalEgresos_E <= dfLim.Total_I) & ((dfLim.SumImp_RP + dfLim.TotalEgresos_E) <= dfLim.Total_I)].eval('(Total_E + SumImp_RP) - Total_I')

dfLim['SalIns'] = (dfLim.Total_I - (dfLim.SumImp_RP + dfLim.Desc_E))


我得到以下结果:
| ID|共计一|SumImp_RP| E共计|埃格雷_E| ImpEgre_E|描述_E| SalIns2|萨林斯|
| --|--|--|--|--|--|--|--|--|
| xxx| 4796.6|三六五八点七五|一千一百三十七点八四|九百八十点九|一百五十六点九四|一千一百三十七点八四||零点零一|
| XXY| 170637.53| 0 |170637.56| 130901.29| 20944.27| 151845.56||18791.97|
| XXZ| 782.64| 0 |1565.26| 674.69|一百零七点九四|782.63||零点零一|
| XYX|四百四十九点一二| 0 |449.11| 387.17|六十一点九四|449.11||零点零一|
| XZY| 25654.02| 21530.45| 8501.18| 1532.76|二百四十五点二十四| 1778 ||2345.57|
但这并不是我想要的,我想找到一种方法,使Total_E尽可能接近Total_I,因为有时Total_E可能大于Total_I,这也是正确的。
此外,如果我能得到萨林斯和SalIns 2在一个单一的列,这将是非常好的。
我尝试过以下方法,但都不管用:

dfLim['diff'] = abs((dfLim['SumImp_RP'] + dfLim['Total_E ']) - dfLim['Total_I'])

mask = (dfLim['Desc_E'] < dfLim['Total_E ']) & \
       (dfLim['Total_E '] <= dfLim['Total_I']) & \
       (dfLim['diff'] <= 0.1)

dfLim['SalIns2'] = dfLim.loc[mask].eval('(Total_E + SumImp_RP) - Total_I')

dfLim = dfLim.drop(columns=['diff'])


这一部分对我来说也产生了同样的结果。
这是我所期待的结果:
| ID|共计一|SumImp_RP| E共计|埃格雷_E| ImpEgre_E|描述_E|萨林斯|
| --|--|--|--|--|--|--|--|
| xxx| 4796.6|三六五八点七五|一千一百三十七点八四|九百八十点九|一百五十六点九四|一千一百三十七点八四|零点零一|
| XXY| 170637.53| 0 |170637.56| 130901.29| 20944.27| 151845.56| -0.03 |
| XXZ| 782.64| 0 |1565.26| 674.69|一百零七点九四|782.63|零点零一|
| XYX|四百四十九点一二| 0 |449.11| 387.17|六十一点九四|449.11|零点零一|
| XZY| 25654.02| 21530.45| 8501.18| 1532.76|二百四十五点二十四| 1778 |2345.57|

pbossiut

pbossiut1#

你可以测试一些组合,并保持这些最小化的差异:

# Scenarios
bal0 = dfLim['Total_I'] - dfLim['Total_E']
bal1 = dfLim['Total_I'] - dfLim['SumImp_RP'] - dfLim['Total_E']
bal2 = dfLim['Total_I'] - dfLim['SumImp_RP'] - dfLim['Desc_E']

# Go to numpy, same as bal = np.stack([bal0, bal1, bal2], axis=1) 
bal = pd.concat([bal0, bal1, bal2], axis=1).to_numpy()

# Extract the min index value (== 0)
dfLim['SalIns'] = bal[abs(bal).argsort() == 0]

字符串
输出量:

id    Total_I  SumImp_RP    Total_E     Egre_E  ImpEgre_E     Desc_E   SalIns
0  xxx    4796.60    3658.75    1137.84     980.90     156.94    1137.84     0.01
1  xxy  170637.53       0.00  170637.56  130901.29   20944.27  151845.56    -0.03
2  xxz     782.64       0.00    1565.26     674.69     107.94     782.63     0.01
3  xyx     449.12       0.00     449.11     387.17      61.94     449.11     0.01
4  xzy   25654.02   21530.45    8501.18    1532.76     245.24    1778.00  2345.57

相关问题