Pandas如何采取最大值,最小值,平均值从行的条件

qojgxg4l  于 2023-03-21  发布在  其他
关注(0)|答案(1)|浏览(159)

我面临着以下问题:我可以做条件列计算,但是,我不能对每一行使用函数min、max、mean

import pandas as pd
data = {'Name': ['Tom', 'nick', 'krish', 'jack','bob'],
        'level_1': [2, -3, 7, -4,-2],
        'level_2': [6, 5, -3, -9,2],
        'level_3': [-2, -1, 4, 6,-4],
        }

df = pd.DataFrame(data)

print(df)

def f(row):
    if (row['level_1'] < 0) & (row['level_2'] < 0):
        
        val = row['level_1'] + row['level_2']
    elif (row['level_1'] > 0) & (row['level_2'] > 0):

        val = row['level_1'] - row['level_2']

    else:
        val = row[['level_1','level_2','level_3']].max#(axis=1)

    return val

df['level_final'] = df.apply(f, axis=1)

print(40*'#')

print(df)

有谁能帮我一下吗?

hzbexzde

hzbexzde1#

#更干净更快捷的解决方案

这里有一个更简洁的方法,使用numpy,比使用lambda和apply方法(没有对行进行向量化)更快。

import numpy as np

df = df.set_index('Name')       #to work with numeric features

#Your 2 conditions
c1 = (df.level_1 < 0) & (df.level_2 < 0)
c2 = (df.level_1 > 0) & (df.level_2 > 0)

#Your 3 values
v1 = df.level_1 + df.level_2    #for c1
v2 = df.level_1 - df.level_2    #for c2
v3 = df.max(1)                  #if c1 and c2 fail

#apply everything, everywhere all at once
df['val'] = np.select([c1, c2], [v1, v2], default=v3)
df = df.reset_index()

print(df)
Name  level_1  level_2  level_3  val
0    Tom        2        6       -2   -4
1   nick       -3        5       -1    5
2  krish        7       -3        4    7
3   jack       -4       -9        6  -13
4    bob       -2        2       -4    2

阅读更多关于numpy.selecthere

#当前代码注意事项

“我需要最大值从每一行(轴=1)的条件”(从您的评论)
你的代码失败的原因是你误解了apply方法的工作原理。当你对行使用apply函数时,你是把每一行作为pd.Series对象拉出来,然后对它应用你的函数f函数,一次一行。
当您在任何row series对象上使用pd.Series.max(axis=1)时,它会按预期抛出以下错误-

ValueError: No axis named 1 for object type Series

对于一个series对象,你不能使用max.axis(1),因为它没有轴。所以不要使用max,或者简单地使用max,这是一个方法的错误语法,只使用pd.Series.max()。阅读文档here
一个三个三个一个

相关问题