python 对“object”类型的列的子集中的行求和

ctzwtxfj  于 2023-08-02  发布在  Python
关注(0)|答案(1)|浏览(97)

我有一个df,这里有太多的复制,但逻辑如下:

data = {'ID': ['12AX', '7YTQ','ZA77'],
        'Value_1': [19, 'Not applicable', 33],
        'Status': ['Not Applicable','Not Applicable','Not Applicable']
        'Value_2': [13,4,15],
        'Value_3': ['Not Applicable', 'Not Applicable', 102.7]
        'Category': ['AAA', 'AAA', 'BA']
}

df = pd.DataFrame(data)

字符串
我尝试创建一个名为Sum的新列,只使用现有列的一个子集(比如Value_1Value_2Value_3),并忽略任何行中可能存在的任何文本。例如,第一行的Sum将是19+13 = 32,列Value_3中的字符串值被忽略,因为它表示Not Applicable
到目前为止,我的函数是这样的,但它要么返回None,要么返回0,我不知道为什么。

def safe_sum(row):
    try:
        float_numbers = [float(x) for x in row if isinstance(x, (int, float))]

        return sum(float_numbers)

    except (ValueError, TypeError):
        return None

df['Sum'] = df[['Value_1','Value_2','Value_3'].apply(safe_sum, axis=1)


有人知道我哪里做错了吗?

x4shl7ld

x4shl7ld1#

您的解决方案工作正常。
另一个解决方案:

df.replace({'Not Applicable':0}, inplace=True)
for col in df.columns:
    df[col] = pd.to_numeric(df[col], errors='coerce')
df['sum'] = df.sum(axis=1)

字符串
如果你只需要列的子集,你可以把最后一行改为:

df['sum'] = df[['Value_1','Value_2','Value_3']].sum(axis=1)

相关问题