首页 > 解决方案 > 如何将包含破折号(-)的两列相乘?

问题描述

df = pd.DataFrame({
                  'A': [15, '-', 173, 190, 68],
                  'B': ['-', 254, '-', 16, 76],
                  'C': [12, '-', 110, 35, 98],
                  'D': [125, 89, 308, 211, 174],
                  'E': [19, 21, '-', 162, '-']
                  })

我有两列要相乘,但这些列包括“-”。在将破折号转换为浮点数或替换为 0 之前,我可以进行乘法运算,但我不想要太多的破折号。此外,当我将数据导出到 Excel 时,由于这些破折号,我的数据会转换为字符串。我希望所有这些都是整数或浮点数,但包括破折号。可能吗?如何在不删除破折号(-)的情况下将这些列相乘?

标签: pandas

解决方案


我认为你的想法是最好的 - 用-数字替换,例如 by NaN,因为对于 multiple 是必要的所有数值:

df = df.mask(df.values == '-').astype(float)

或者:

df = df.apply(pd.to_numeric, errors='coerce')

print (df)
       A      B      C      D      E
0   15.0    NaN   12.0  125.0   19.0
1    NaN  254.0    NaN   89.0   21.0
2  173.0    NaN  110.0  308.0    NaN
3  190.0   16.0   35.0  211.0  162.0
4   68.0   76.0   98.0  174.0    NaN

最后如果需要-返回:

df = df.fillna('-')

na_rep或通过参数转换缺失值DataFrame.to_excel

df.to_excel(file, na_rep='-')

但是在函数中使用 try-expect 是可能的,但速度很慢,所以不推荐:

def mult_with_dash(x):
    try:
        return float(x['A']) * float(x['E']) 
    except Exception:
        return '-'

df['new'] = df.apply(mult_with_dash, axis=1)
print (df)
     A    B    C    D    E    new
0   15    -   12  125   19    285
1    -  254    -   89   21      -
2  173    -  110  308    -      -
3  190   16   35  211  162  30780
4   68   76   98  174    -      -

推荐阅读