繁体   English   中英

使用 Python 更新每一行中的最大值 dataframe 与 [具有最大值的列] 和 [列名阈值] 的总和

[英]Using Python Update the maximum value in each row dataframe with the sum of [column with maximum value] and [column name threshold]

Day US  INDIA   JAPAN   GERMANY AUSTRALIA Threshold
11  40  30      20      100     110         5
21  60  70      80      55      57          8
32  12  43      57      87      98          9
41  99  23      45      65      78          12

这是演示数据框,在这里我想为来自 3 个国家(印度、德国、美国)的每一行选择最大值,然后将阈值添加到该最大值记录中,然后将其添加到最大值中并在 dataframe 中更新它.让我们举个例子:

最大值[美国、印度、德国] = 最大值[美国、印度、德国] + 阈值

执行此 dataframe 后将更新如下:

Day US  INDIA   JAPAN   GERMANY AUSTRALIA Threshold
11  40  30      20      105     110       5
21  60  78      80      55      57        8
32  12  43      57      96      98        9
41  111 23      45      65      78        12

我尝试使用 for 循环实现此目的,但执行时间太长:

df_max = df_final[['US','INDIA','GERMANY']].idxmax(axis=1)
for ind in df_final.index:
    column = df_max[ind]
    df_final[column][ind] = df_final[column][ind] + df_final['Threshold'][ind]

请帮我解决一下这个。 期待一个好的解决方案,提前致谢...!!!

第一个解决方案将每行的最大值与过滤列的所有值进行比较,然后通过Threshold进行多重掩码并添加到原始列:

cols = ['US','INDIA','GERMANY']
df_final[cols] += (df_final[cols].eq(df_final[cols].max(axis=1), axis=0)
                        .mul(df_final['Threshold'], axis=0))

print (df_final)
   Day   US  INDIA  JAPAN  GERMANY  AUSTRALIA  Threshold
0   11   40     30     20      105        110          5
1   21   60     78     80       55         57          8
2   32   12     43     57       96         98          9
3   41  111     23     45       65         78         12

或者使用 numpy - 通过idxmax获取列名,从列表cols中按数组比较,多个并添加到原始列:

cols = ['US','INDIA','GERMANY']

df_final[cols] += ((np.array(cols) == df_final[cols].idxmax(axis=1).to_numpy()[:, None]) * 
                     df_final['Threshold'].to_numpy()[:, None])

print (df_final)
   Day   US  INDIA  JAPAN  GERMANY  AUSTRALIA  Threshold
0   11   40     30     20      105        110          5
1   21   60     78     80       55         57          8
2   32   12     43     57       96         98          9
3   41  111     23     45       65         78         12

如果每行有多个最大值,则解决方案会有所不同。

第一个解决方案将阈值添加到所有最大值,第二个解决方案添加到第一个最大值。

print (df_final)
   Day  US  INDIA  JAPAN  GERMANY  AUSTRALIA  Threshold
0   11  40    100     20      100        110          5 <-changed data double 100
1   21  60     70     80       55         57          8
2   32  12     43     57       87         98          9
3   41  99     23     45       65         78         12


cols = ['US','INDIA','GERMANY']
df_final[cols] += (df_final[cols].eq(df_final[cols].max(axis=1), axis=0)
                        .mul(df_final['Threshold'], axis=0))

print (df_final)
   Day   US  INDIA  JAPAN  GERMANY  AUSTRALIA  Threshold
0   11   40    105     20      105        110          5
1   21   60     78     80       55         57          8
2   32   12     43     57       96         98          9
3   41  111     23     45       65         78         12

cols = ['US','INDIA','GERMANY']

df_final[cols] += ((np.array(cols) == df_final[cols].idxmax(axis=1).to_numpy()[:, None]) * 
                     df_final['Threshold'].to_numpy()[:, None])

print (df_final)
   Day   US  INDIA  JAPAN  GERMANY  AUSTRALIA  Threshold
0   11   40    105     20      100        110          5
1   21   60     78     80       55         57          8
2   32   12     43     57       96         98          9
3   41  111     23     45       65         78         12

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM