使用apply将列附加到数据帧,并使用apply on th基于现有值计算新列

2024-04-25 22:24:14 发布

您现在位置:Python中文网/ 问答频道 /正文

给定一个数据帧

  a b c d
1 5 5 5 5
2 5 5 5 5
3 5 5 5 5

我想在现有列的基础上在DataFrame上添加更多的列,但是使用一些逻辑,这些逻辑不能放在lambda中。期望的结果应该如下所示:

   a  a_added  c  c_added  d  d_added
1  5  'good'   5  'good'   5   'bad'
2  5  'bad'    5  'good'   5   'bad'
3  5  'good'   5  'good'   5   'bad'

在看到this答案之后,我的想法是在每一行上使用DataFrame.apply(),然后在每一个值上使用Series.apply(),但我不知道如何链接调用和返回什么,因此我从序列的apply函数返回一个新的列名。之后,我想我需要将这两个数据帧与DataFrame.join()结合起来。我真的需要使用Series.apply(),因为我必须用一些自定义逻辑来计算每个值。你知道吗

编辑: 我有一个阈值映射,其中键对应于我的数据帧中的列名,值是警告/严重阈值,加上一个说明当前值应如何与阈值进行比较的操作:

thresholds = {
    'a': {'warning': 90, 'critical': 98, operation: 'lt'},
    'b': {'warning': 10, 'critical': 15, operation: 'gt'},
    'c': {'warning': 5, 'critical': 9, operation: 'le'}
}

编辑2: 使用具有上述阈值的以下输入:

  a   b  c
1 89  0  4
2 91  9  10
3 99 17  5

结果如下:

    a  a_r    b  b_r   c   c_r
1  89  good   0  good   4  good
2  91  warn   9  warn  10  crit
3  99  crit  17  good   5  warn

因此,对于每个值(取决于列名),我必须从映射中应用相应的阈值。你知道吗


Tags: 数据编辑dataframeadded阈值逻辑operationseries
1条回答
网友
1楼 · 发布于 2024-04-25 22:24:14

用途:

print (df)
    a   b   c
1  89  11   4
2  91   9  10
3  99  17   5


thresholds = {
    'a': {'warning': 90, 'critical': 98, 'operation': 'lt'},
    'b': {'warning': 10, 'critical': 15, 'operation': 'gt'},
    'c': {'warning': 5, 'critical': 9, 'operation': 'le'}
}

import operator

ops = {'gt': operator.gt,
       'lt': operator.lt,
       'ge': operator.ge,
       'le': operator.le,
       'eq': operator.eq,
       'ne': operator.ne}

for k, v in thresholds.items():
    op1 = v.pop('operation')
    if op1 in ('lt','le'):
        sorted_v = sorted(v.items(), key=operator.itemgetter(1))
    else:
        sorted_v = sorted(v.items(), key=operator.itemgetter(1), reverse=True)
    for k1, v1 in sorted_v:

        #https://stackoverflow.com/q/46421521/2901002
        m = ops[op1](v1, df[k])
        df.loc[m, f'{k}_added'] = k1

df = df.sort_index(axis=1).fillna('good')
print (df)
    a   a_added   b   b_added   c   c_added
1  89      good  11  critical   4      good
2  91   warning   9   warning  10  critical
3  99  critical  17      good   5   warning

相关问题 更多 >

    热门问题