更新dataframe pandas中的负值

epggiuax  于 2023-03-21  发布在  其他
关注(0)|答案(1)|浏览(119)

我有以下 Dataframe :
| 合伙人|0天|1-30天|31 - 60天|61 - 90天|共计|
| - ------|- ------|- ------|- ------|- ------|- ------|
| 154678|二百元| -50.00 |一百六十元|三百元|六百一十|
| 小行星234567|一百元| -150.00 |五十元|一百二十元|一百二十元|

  • 步骤1:在每一行中查找负值。例如,第2行为-150.00
  • 第二步:取最大可用正数。例如,第二行为120.00
  • 步骤3:将负值的绝对值(-150)与120进行比较
  • 步骤4:如果绝对值小于最大正数,则简单地将负数转换为零并从最大正数中减去它。
  • 步骤5:否则,就像我们在第2行,转换最大的数字为0,并将其值添加到负数.我们将有-30.00在第2行.然后采取当前最大的数字,这是0在我们的情况下,并重复相同的过程.继续这样做,直到绝对值小于可用的最大正数.
  • 第6步:达到此级别后,重复第4步

生成的Dataframe应该是这样的:
| 合伙人|0天|1-30天|31 - 60天|61 - 90天|共计|
| - ------|- ------|- ------|- ------|- ------|- ------|
| 154678|二百元|千|一百六十元|二百五十元|六百一十|
| 小行星234567|七十分|千|五十元|千|一百二十元|
我已经尝试了很多不同的方法来遍历行,但我不能解决这个问题。
我试着遍历每一行的列,但是我尝试过的所有方法都没有给予我预期的结果,甚至不能得到接近的结果。

ou6hu8tu

ou6hu8tu1#

可以使用idxminìdxmax函数将伪代码转换为python代码。定义

def equalize_row(row):
    idx_neg = row.idxmin()
    to_equalize = row.loc[idx_neg]
    while to_equalize < 0:
        idx=row.idxmax()
        to_equalize = to_equalize + row.loc[idx]
        if to_equalize < 0:
            row[idx] = 0
        else:
            row[idx] = to_equalize
    row[idx_neg] = 0

然后您可以通过以下方式将其应用于所有行

temp = pd.DataFrame([[100,700,300,-900,200],[100,-700,300,900,600]],
                    index=[154678,234567],
                    columns=['0 Days','1-30 Days','31 - 60 Days','61 - 90 Days','Total'])

for i,r in temp.iloc[:,:-1].iterrows():
    equalize_row(r)

相关问题