使用函数根据列满足的条件在pandas中创建新列

3

我有一个pandas数据框中的几列。根据每一列,我都需要创建一个新的列。这个函数可以实现:

def f(row):
    if row['col_1'] == 0:
        val = 'Neutral'
    elif row['col_1'] > 0:
        val = 'Growth'
    else:
        val = 'Contraction'
    return val

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

但是因为我有几列需要进行比较(col_2,col_3等),所以我想在函数中传递列名作为参数。

def f(row,col_name):
    if row[col_name] == 0:
        val = 'Neutral'
    elif row[col_name] > 0:
        val = 'Growth'
    else:
        val = 'Contraction'
    return val

df['New_Col_1'] = df.apply(f(row,'col_1') , axis=1)

但是,出现了一个错误。它说参数 'row' 未定义。我该如何解决?


1
你缺少一个 lambda 函数:df.apply(lambda row: f(row,'col_1') , axis=1) - Nickil Maveli
这个程序可以正常工作。谢谢! - prashanth manohar
3个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
5

请查看df.loc[],它接受两个参数,你可以将它们视为行规范和列规范,所以你可以像这样使用它:

df['New_Col_1'] = 'Contraction' # Default, to be overwritten below
df.loc[df['col_1'] == 0, 'New_Col_1'] = 'Neutral'
df.loc[df['col_1'] > 0, 'New_Col_1'] = 'Growth'

2
您可以使用 df.loc[条件, 列名] = 值 来过滤数据框并写入新值:
df['New_Col_1'] = None # initial
df.loc[df.col1==0, 'New_Col_1'] = 'Neutral'
df.loc[df.col1>0, 'New_Col_1'] = 'Growth'
df.loc[df.col1<0, 'New_Col_1'] = 'Contraction'

1
df.apply()缺少一个lambda函数,正如评论中所提到的。
def f(row,col_name):
    if row[col_name] == 0:
        val = 'Neutral'
    elif row[col_name] > 0:
        val = 'Growth'
    else:
        val = 'Contraction'
    return val

df['New_Col_1'] = df.apply(lambda row: f(row,'col_1') , axis=1)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,