计算某列是否为空

Calculate some column if it is empty

我有问题。如果列是 NaNNone,我想计算 m3。不幸的是,我不知道如何在 pandas 中创建这种 if 条件。有没有更好更快的方法来计算这些公式,例如直接在 pandas 中而不需要额外的方法?

公式

if m3 is None
   if CMT
        dimension to m
        calculate m3
   if INH
        calculate dimension to cm
        dimension to m
        calculate m3

数据框

  dimension_unit  dimension_length  dimension_height  dimension_width    m3
0            CMT              50.0              80.0             60.0  0.24
1            INH              15.0              10.0             10.0   NaN
2            CMT              80.0             120.0             56.0   NaN

代码

import pandas as pd

d = { 
    'dimension_unit': ['CMT', 'INH', 'CMT'], 
    'dimension_length': [50, 15,    80.0], 
    'dimension_height': [80, 10, 120.0], 
    'dimension_width': [60, 10, 56.0],
    'm3': [0.24, None, None]
    }
df = pd.DataFrame(data=d)
print(df)

def calculate_m3(x, unit, length, height, width, m3):
  m3 = x[m3]
   if m3 == None:
   print(x)
   unit = x[unit]
   length = x[length]
   height = x[height]
   width = x[width]
   if(unit == 'CMT'):
     length_in_m = length / 100
     width_in_m = width / 100
     height_in_m = height / 100
     return round(length_in_m * width_in_m * height_in_m,3)
   else:
     length_in_m = (length * 2.54) / 100
     width_in_m = (width * 2.54) / 100
     height_in_m = (height * 2.54) / 100
     return round(length_in_m * width_in_m * height_in_m,3)



df['m3'] = df.apply(lambda x: calculate_m3(x, 'dimension_unit', 'dimension_length', 'dimension_height', 'dimension_width', m3))

[OUT]
KeyError: 'dimension_unit'

我想要的

  dimension_unit  dimension_length  dimension_height  dimension_width    m3
0            CMT              50.0              80.0             60.0  0.24
1            INH              15.0              10.0             10.0  0.037
2            CMT              80.0             120.0             56.0  0.538

IIUC,你想干什么

def calculate_m3(x, unit, length, height, width, m3):
    m3 = x[m3]
    if m3 != m3:
        # You should compare `NaN` not
        unit = x[unit]
        length = x[length]
        height = x[height]
        width = x[width]
        if(unit == 'CMT'):
            length_in_m = length / 100
            width_in_m = width / 100
            height_in_m = height / 100
            return round(length_in_m * width_in_m * height_in_m,3)
        else:
            length_in_m = (length * 2.54) / 100
            width_in_m = (width * 2.54) / 100
            height_in_m = (height * 2.54) / 100
            return round(length_in_m * width_in_m * height_in_m,3)
    else:
        return m3

df['m3'] = df.apply(lambda x: calculate_m3(x, 'dimension_unit', 'dimension_length', 'dimension_height', 'dimension_width', 'm3'), axis=1)
print(df)

  dimension_unit  dimension_length  dimension_height  dimension_width     m3
0            CMT              50.0              80.0             60.0  0.240
1            INH              15.0              10.0             10.0  0.025
2            CMT              80.0             120.0             56.0  0.538

你也可以试试np.where

import numpy as np

cols = ['dimension_length', 'dimension_height', 'dimension_width']

df['m3'] = df['m3'].mask(df['dimension_unit'].eq('CMT') & df['m3'].isna(), np.prod(df[cols].div(100), axis=1))
df['m3'] = df['m3'].mask(df['dimension_unit'].eq('INH') & df['m3'].isna(), np.prod(df[cols].mul(2.54).div(100), axis=1))
df['m3'] = df['m3'].round(3)
print(df)

  dimension_unit  dimension_length  dimension_height  dimension_width     m3
0            CMT              50.0              80.0             60.0  0.240
1            INH              15.0              10.0             10.0  0.025
2            CMT              80.0             120.0             56.0  0.538