【问题标题】:Perform arithemetic operation on np.where()对 np.where() 执行算术运算
【发布时间】:2020-11-15 18:22:25
【问题描述】:
A   B   C

0   1   5
5   8   4
6   3   2 
4   7   1 
2   0   8

这是我的数据框。

我想将每一列与另一列进行比较,并将最高值存储在一个新变量中。因此决定谁是赢家

例如。让我们比较 A 列和 B 列

for i in df.columns[1:]: 
    for j in df.columns[1:]: 
        if i != j:
            np.where(df[i] >= df[j], totalI = totalI+df[i], totalJ=totalJ+df[j])

执行时我收到此错误:TypeError: where() got an unexpected keyword argument 'totalI'。

A 与 B 比较时的预期输出:totalI = 8 和 totalJ = 16

我是 python 新手。我想要一个解决方案来存储添加的值,以防 np.where 的真假

【问题讨论】:

  • 请为您的示例添加特定的预期输出以及您尝试的问题以提供reproducible example
  • 我已经改写了这个问题。现在清楚了吗?
  • 您是否阅读过有关如何使用 np.where 的文档?不应该这样称呼它。您是在尝试进行多重比较还是实际上是在尝试为变量赋值?如果是后者,请将作业移出 np.where
  • 是的,我确实阅读了文档。它不允许在参数内部分配。有没有办法我可以添加所有最高值,而无需将 np.where() 单独分配给新列。

标签: python dataframe


【解决方案1】:

我想我明白你在说什么,如果我错了,请纠正我。

我假设你有一个类似这样的数据框:

import pandas as pd
df = pd.DataFrame([[0, 1, 5], [5, 8, 4], [6, 3, 2], [4, 7, 1], [2, 0, 8]], columns = ["A", "B", "C"])

这是我从你的示例数据集中得到的。

然后我用itertools 想出了["A", "B", "C"] 列的尽可能多的组合,例如A > BB > A,如下所示:

import itertools
combination_columns = list(itertools.permutations(["A", "B", "C"], 2))

然后,如果您遍历每个定理,并将它们添加到这样的字典中:

import numpy as np
totals = {}
for comb in combination_columns:
    totals[f"{comb[0]} > {comb[1]}"] = sum(np.where(df[comb[0]] > df[comb[1]], df[comb[0]], 0))

你明白了:

>>> print(totals)
{'A > B': 8, 'A > C': 15, 'B > A': 16, 'B > C': 18, 'C > A': 13, 'C > B': 13}

如您所见,您的totalI 等同于totals['A > B'],您的totalJ 等同于totals['B > A']。显然,如果它更适合您,您可以使用不同的命名方案。

整个代码如下:

import pandas as pd
import itertools
import numpy as np
df = pd.DataFrame([[0, 1, 5], [5, 8, 4], [6, 3, 2], [4, 7, 1], [2, 0, 8]], columns = ["A", "B", "C"])
combination_columns = list(itertools.permutations(["A", "B", "C"], 2))

totals = {}
for comb in combination_columns:
    totals[f"{comb[0]} > {comb[1]}"] = sum(np.where(df[comb[0]] > df[comb[1]], df[comb[0]], 0))

print(totals)

关于您的评论,可以这样重写:

import pandas as pd
import itertools
import numpy as np
df = pd.DataFrame([[0, 1, 5], [5, 8, 4], [6, 3, 2], [4, 7, 1], [2, 0, 8]], columns = ["A", "B", "C"])
combination_columns = list(itertools.combinations(["A", "B", "C"], 2))

totals = {}
for comb in combination_columns:
    x_vs_y = sum(np.where(df[comb[0]] > df[comb[1]], df[comb[0]], 0))
    y_vs_x = sum(np.where(df[comb[0]] < df[comb[1]], df[comb[1]], 0))
    totals[f"{comb[0]} Vs {comb[1]}"] = comb[0] if x_vs_y > y_vs_x else comb[1]

print(totals)

它不干净,但如果你想做你的清单想法,这就是我想出的:

import pandas as pd
import itertools
import numpy as np
df = pd.DataFrame([[0, 1, 5], [5, 8, 4], [6, 3, 2], [4, 7, 1], [2, 0, 8]], columns = ["A", "B", "C"])
combination_columns = list(itertools.combinations(["A", "B", "C"], 2))

totals = []
for comb in combination_columns:
    x_vs_y = sum(np.where(df[comb[0]] > df[comb[1]], df[comb[0]], 0))
    y_vs_x = sum(np.where(df[comb[0]] < df[comb[1]], df[comb[1]], 0))
    totals.append((comb[0] if x_vs_y > y_vs_x else comb[1]) + ' beats ' + (comb[1] if x_vs_y > y_vs_x else comb[0]))

print(totals)

【讨论】:

  • 首先感谢您的快速回复。在我的情况下,如果 A 与 B 进行比较,那么我们不需要比较 Visa 反之。正如我们已经知道两者中最高的。即 B(顺序无关紧要)。所以我预期的 o/p 是['B wins over A': 'B wins over C' : 'A wins over C']
  • 谢谢 jimbob88。它解决了我的问题。
猜你喜欢
  • 1970-01-01
  • 2014-02-06
  • 2017-01-10
  • 2021-06-23
  • 2013-09-06
  • 2012-09-12
  • 1970-01-01
  • 1970-01-01
  • 2014-10-20
相关资源
最近更新 更多