我的数据框中有一组具有不同值的列,如下面的示例所示:

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或最大值.

推荐答案

首先按DataFrame.filter中的子字符串Especies开始筛选需要的列,设置最大值和0值的缺失值,减go 最大值,转换为绝对值,最后得到平均值:

df1 = df.filter(regex='^Especies')

#or if necessary specify columns names in list
#cols = ['Especies', 'Especies_0', 'Especies_1', 'Especies_2', 'Especies_3']
#df1 = df[cols]

max1 = df1.max(axis=1)
mask = df1.ne(max1, axis=0) & df1.ne(0)
df['new'] = df1.where(mask).sub(max1, axis=0).abs().mean(axis=1)
print (df)
    Especies  Especies_0  Especies_1  Especies_2  Especies_3       new
0       2.20        3.44        1.90        1.24        0.00  1.660000
1       2.20        3.04        2.55        0.00        0.00  0.665000
2       1.88        2.19        0.00        0.00        0.00  0.310000
3       2.20        3.44        2.28        2.55        0.00  1.096667
4       3.44        2.20        0.00        0.00        0.00  1.240000
5       2.20        2.58        0.00        0.00        0.00  0.380000
6       1.88        2.19        0.00        0.00        0.00  0.310000
7       3.44        1.91        3.04        1.83        3.98  1.425000
8       3.44        2.20        0.00        0.00        0.00  1.240000
9       2.20        2.55        1.90        0.00        0.00  0.500000
10      1.88        2.20        0.00        0.00        0.00  0.320000

Details:

print (df1.where(mask))
    Especies  Especies_0  Especies_1  Especies_2  Especies_3
0       2.20         NaN        1.90        1.24         NaN
1       2.20         NaN        2.55         NaN         NaN
2       1.88         NaN         NaN         NaN         NaN
3       2.20         NaN        2.28        2.55         NaN
4        NaN        2.20         NaN         NaN         NaN
5       2.20         NaN         NaN         NaN         NaN
6       1.88         NaN         NaN         NaN         NaN
7       3.44        1.91        3.04        1.83         NaN
8        NaN        2.20         NaN         NaN         NaN
9       2.20         NaN        1.90         NaN         NaN
10      1.88         NaN         NaN         NaN         NaN

print (df1.where(mask).sub(max1, axis=0))
    Especies  Especies_0  Especies_1  Especies_2  Especies_3
0      -1.24         NaN       -1.54       -2.20         NaN
1      -0.84         NaN       -0.49         NaN         NaN
2      -0.31         NaN         NaN         NaN         NaN
3      -1.24         NaN       -1.16       -0.89         NaN
4        NaN       -1.24         NaN         NaN         NaN
5      -0.38         NaN         NaN         NaN         NaN
6      -0.31         NaN         NaN         NaN         NaN
7      -0.54       -2.07       -0.94       -2.15         NaN
8        NaN       -1.24         NaN         NaN         NaN
9      -0.35         NaN       -0.65         NaN         NaN
10     -0.32         NaN         NaN         NaN         NaN

Python相关问答推荐

在Python中对分层父/子列表进行排序

Pandas 有条件轮班操作

scikit-learn导入无法导入名称METRIC_MAPPING64'

基于索引值的Pandas DataFrame条件填充

我对我应该做什么以及我如何做感到困惑'

如何设置视频语言时上传到YouTube与Python API客户端

ThreadPoolExecutor和单个线程的超时

索引到 torch 张量,沿轴具有可变长度索引

下三角形掩码与seaborn clustermap bug

LocaleError:模块keras._' tf_keras. keras没有属性__internal_'''

以逻辑方式获取自己的pyproject.toml依赖项

如何检测鼠标/键盘的空闲时间,而不是其他输入设备?

OpenCV轮廓.很难找到给定图像的所需轮廓

Odoo16:模板中使用的docs变量在哪里定义?

如何根据rame中的列值分别分组值

在极点中读取、扫描和接收有什么不同?

Python Mercury离线安装

需要帮助使用Python中的Google的People API更新联系人的多个字段'

用来自另一个数据框的列特定标量划分Polars数据框中的每一列,

将鼠标悬停在海运`pairplot`的批注/高亮显示上