Python:评估函数的输出

时间:2019-03-01 19:45:05

标签: python pandas dataframe apply

我有一个大型数据框,其中包含许多列,但是我只看一列。

此示例是为了简化。我定义了一个新列col2,如果满足第一列的条件,它将存储一个布尔值。

raw_data = { 'col1': [[0, 2, 3, 4],[6, 7, 1000, 40, 20],[4, 20, 100]]}
df = pd.DataFrame(raw_data, columns = ['col1'])
df

df['col2'] = 'default'
df

                     col1                   col2
row1         [2,3,44,89.6,...]            default
row2         [10,4,33.3,1.11,...]         default

我需要对col1进行一些计算,如果满足某些条件,则在同一行的col2中的默认值为True,否则为False。

简化的计算

计算列表中的最大值,列表的长度和平均值。

我在一个函数中进行这些计算,然后介绍另一个尝试执行评估部分的函数。

例如,如果最大值> 10,并且列表长度> 5,并且平均值> 25,则使col2中的默认值为True。

我相信我必须使用.apply()函数。

df['col2'] = df.apply (lambda row: my_functions (row),axis=1)

必需的输出

                   col1                   col2
row1         [2,3,44,89.6,...]            True
row2         [10,4,33.3,1.11,...]         False

我很困在这里,因为我不知道如何进行一些计算并遍历整个列并评估这些计算。

谢谢!

3 个答案:

答案 0 :(得分:0)

有几种方法可以执行此操作,但是您无需在进行计算之前设置col2。您可以在apply属性中放入您选择的功能。只需记住,使用apply到函数的输入是一行一行

raw_data = { 'col1': [[0, 2, 3, 4],[6, 7, 1000, 40, 20],[4, 20, 100]]}
    df = pd.DataFrame(raw_data, columns = ['col1'])

    # if max(list) > 10 --> True

def my_function (row):

    if max(row['col1'])>10:
        row = True
    else:
        row = False
    return row


df['col2'] = df.apply(my_function, axis =1)

df
                   col1   col2
0          [0, 2, 3, 4]  False
1  [6, 7, 1000, 40, 20]   True
2          [4, 20, 100]   True

答案 1 :(得分:0)

这是一种方法:

raw_data = {'col1': [[0, 2, 3, 4], [6, 7, 1000, 40, 20, 13], [4, 20, 100]]}
df = pd.DataFrame(raw_data, columns=['col1'])

def my_functions(r):
    nb = len(r.col1)
    average = sum(r.col1) / nb
    maxl = max(r.col1)
    return maxl > 10 and len(r.col1) > 5 and average > 25


df['col2'] = df.apply(lambda row: my_functions(row), axis=1)
print(df)

输出:

                       col1   col2
0              [0, 2, 3, 4]  False
1  [6, 7, 1000, 40, 20, 13]   True
2              [4, 20, 100]  False

答案 2 :(得分:0)

如果数据框较大,则可以使用矢量化函数:

def my_func(l):
    return (max(l) > 10) and (len(l) > 5) and (np.mean(l) > 25)

my_func = np.vectorize(my_func)

df['col2'] = my_func(df['col1'].values)

输出:

col1                        col2
[0, 2, 3, 4]                False
[6, 7, 1000, 40, 20, 13]    True
[4, 20, 100]                False