计算某列是否为空
Calculate some column if it is empty
我有问题。如果列是 NaN
或 None
,我想计算 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
我有问题。如果列是 NaN
或 None
,我想计算 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