我想我明白你在说什么,如果我错了,请纠正我。
我假设你有一个类似这样的数据框:
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 > B、B > 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)