我在dataframe中有一堆具有不同值的列,如以下示例所示:
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))
但是我不能把我的函数应用到 Dataframe 上。我试过df.apply()和df.applymap(),但它们似乎不适用于我所做的函数(applymap只考虑1个输入和1个输出,而apply并没有分别为函数提供每一行,因此函数返回ValueError,因为序列的真值是不明确的)。
我也试过直接用dataframe来做,但由于它有复杂的逻辑,我还没能找到解决方案。
我遇到的主要问题似乎是检查我要减去的值是否不是0.0或最大值。
1条答案
按热度按时间zu0ti5jz1#
首先通过在
DataFrame.filter
中启动子字符串Especies
来过滤必要的列,为最大值和0
值设置缺失值,减去最大值,转换为绝对值,最后得到平均值:详情: