我的数据框中有一组具有不同值的列,如下面的示例所示:
Especies Especies_0 Especies_1 Especies_2 Especies_3
2.20 3.44 1.90 1.24 0.00
2.20 3.04 2.55 0.00 0.00
1.88 2.19 0.00 0.00 0.00
2.20 3.44 2.28 2.55 0.00
3.44 2.20 0.00 0.00 0.00
2.20 2.58 0.00 0.00 0.00
1.88 2.19 0.00 0.00 0.00
3.44 1.91 3.04 1.83 3.98
3.44 2.20 0.00 0.00 0.00
2.20 2.55 1.90 0.00 0.00
1.88 2.20 0.00 0.00 0.00
我要执行的操作是:
avg(abs(max - col) for col in cols)
个
其中,max是每行中各列的最大值(例如,对于第一行,max将是3.44,cols是列中的其余值),abs是绝对函数,avg表示取平均值.
例如,对于第一行,操作将是:((3.44-2.20)+(3.44-1.90)+(3.44-1.24))/3 = 1.66
对于第5行,值为(3.44, 2.20, 0.00, 0.00, 0.00)
,结果将为:(3.44 -2.20) /1 = 1.24
这很简单,但有一个问题,我不想考虑最大值的列,也不想考虑其中包含0.0的任何列(考虑到最大值列会发生变化,这与它们中包含0.0的列数并不总是相同).
我已经设法用单个标量值实现了这一点,我甚至还实现了一个函数来实现这一点
def ele_diff(esp0, esp1, esp2, esp3, esp4):
species = sorted([esp0, esp1, esp2, esp3, esp4])
diff = [species[-1] - spec for spec in species if spec != 0.0 and spec !=species[-1]]
return (sum(diff)/len(diff))
但我无法将我的函数应用于数据帧.我try 了df.apply()和df.applymap(),但它们似乎不适用于我创建的函数(applymap只考虑1个输入和1个输出,而Apply不单独为函数的每一行提供数据,因此该函数返回ValueError,因为序列的真值不明确).
我也try 过直接使用数据帧,但由于它具有复杂的逻辑,我一直无法提出解决方案.
我面临的主要问题似乎是判断我要减go 的值是否不是0.0或最大值.