【问题标题】:Calculated DataFrame column by a column condition按列条件计算的 DataFrame 列
【发布时间】:2022-11-10 17:21:26
【问题描述】:

我是 Python 新手,我正在尝试根据同一数据帧的另一列的条件计算数据帧的新列。

我有一个包含 A、B、C、D、E 列的 DataFrame。

我需要计算新列 F:

F = A - B if E == 'Y'
F = A - (C + D) if E == 'N'

我尝试使用函数Apply,但它不起作用。

这是我的代码:

def my_funcion(column): 
    if column == 'N' :
        return df['B']
    if column== 'Y' :
        return (df['C'] + df['D'])
df['F'] = df['A'] - df.apply(myfunction(df['E'], axis=1) 

但它向我显示了这个错误:

ValueError:('一个Series的真值不明确。使用a.empty, a.bool(), a.item(), a.any() 或 a.all().', u'发生在索引 0'

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    我想你可以使用numpy.where

    如果E 中只有YN 值,则解决方案:

    np.random.seed(145)
    df = pd.DataFrame(np.random.randint(10,size=(5,4)), columns=list('ABCD'))
    df['E'] = ['Y'] * 3 + ['N'] * 2 
    
    df['F'] = np.where(df['E'] == 'Y', df['A'] - df['B'], df['A'] - (df['C'] + df['D']))
    print (df)
    
       A  B  C  D  E   F
    0  5  5  6  7  Y   0
    1  2  5  8  5  Y  -3
    2  1  2  0  8  Y  -1
    3  4  5  8  9  N -13
    4  1  6  7  6  N -12
    

    如果列中的解决方案 E 不仅是 NY

    np.random.seed(145)
    df = pd.DataFrame(np.random.randint(10,size=(5,4)), columns=list('ABCD'))
    df['E'] = ['Y'] * 2 + ['N'] * 2  + ['X']
    
    df['F'] = np.where(df['E'] == 'Y', df['A'] - df['B'], 
              np.where(df['E'] == 'N', df['A'] - (df['C'] + df['D']), 100))
    print (df)
    
       A  B  C  D  E    F
    0  5  5  6  7  Y    0
    1  2  5  8  5  Y   -3
    2  1  2  0  8  N   -7
    3  4  5  8  9  N  -13
    4  1  6  7  6  X  100
    

    如果想使用apply(更慢):

    def my_funcion(column): 
        if column['E'] == 'Y' :
            return column['B']
        if column['E'] == 'N' :
            return (column['C'] + column['D'])
    
    df['F'] = df['A'] - df.apply(my_funcion, axis=1) 
    print (df)
    
       A  B  C  D  E   F
    0  5  5  6  7  Y   0
    1  2  5  8  5  Y  -3
    2  1  2  0  8  N  -7
    3  4  5  8  9  N -13
    4  1  6  7  6  N -12
    

    【讨论】:

    • 谢谢@jezrael,现在它可以工作了……但是我需要定义该功能,因为我需要在代码的不同部分中使用它。那么,如果我想定义函数,我该如何更改我的代码?
    • 抱歉,我编辑了我的第一条评论,因为我需要再问你一个问题。请阅读我的第一条评论..
    • 就一个问题。如果我想在另一列上添加条件,例如不同于 0(零)的 Z 列,我必须写: np.where(df['E'] == 'Y' and df['Z'] != 0, df['A'] - df['B']) ???但它显示一个错误。你能帮我写正确吗?
    • Z 列是 Float64
    • 您需要np.where(d(f['E'] == 'Y') & (df['Z'] != 0), df['A'] - df['B'], df['A'] - (df['C'] + df['D'])) 进行按位与。
    猜你喜欢
    • 2017-03-01
    • 2021-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-02
    • 2021-09-11
    • 1970-01-01
    • 2015-07-10
    相关资源
    最近更新 更多