考虑我有以下数据帧
d = {'quantity': [100, 910, 500, 50, 0.5, 22.5, 1300, 600, 20], 'uom': ['KG', 'GM', 'KG', 'KG', 'GM', 'MT', 'GM', 'GM', 'MT']}
df = pd.DataFrame(data=d)
df
我的数据框是这样的:
quantity uom
0 100.0 KG
1 910.0 GM
2 500.0 KG
3 50.0 KG
4 0.5 GM
5 22.5 MT
6 1300.0 GM
7 600.0 GM
8 20.0 MT
现在我想为所有数据使用单个UOM。为此,我有以下代码:
listy = []
listy.append(list(df['quantity']))
listy.append(list(df['uom']))
for index, x in enumerate(listy[0]):
if listy[1][index] == 'MT':
listy[0][index] = '{:1.4f}'.format(x * 1000)
listy[1][index] = 'KG'
elif listy[1][index] == 'LBS':
listy[0][index] = '{:1.4f}'.format(x * 0.453592)
listy[1][index] = 'KG'
elif listy[1][index] == 'GM':
listy[0][index] = '{:1.4f}'.format(x * 0.001)
listy[1][index] = 'KG'
elif listy[1][index] == 'MG':
listy[0][index] = '{:1.4f}'.format(x * 0.000001)
listy[1][index] = 'KG'
elif listy[1][index] == 'KG':
listy[0][index] = '{:1.4f}'.format(x * 1)
listy[1][index] = 'KG'
df['quantity'] = listy[0]
df['uom'] = listy[1]
df
quantity uom
0 100.0000 KG
1 0.9100 KG
2 500.0000 KG
3 50.0000 KG
4 0.0005 KG
5 22500.0000 KG
6 1.3000 KG
7 0.6000 KG
8 20000.0000 KG
但是如果我们有一个非常大的数据帧,我不认为循环它将是一个很好的方法来做到这一点。
我能以更好的方式做同样的事情吗?我也在尝试使用List Comprehension但是无法使用它。
使用dict
和multiply
映射值,即
vals = {'MT':1000, 'LBS':0.453592, 'GM': 0.001, 'MG':0.000001, 'KG':1}
df['new'] = df['quantity']*df['uom'].map(vals)
quantity uom new
0 100.0 KG 100.0000
1 910.0 GM 0.9100
2 500.0 KG 500.0000
3 50.0 KG 50.0000
4 0.5 GM 0.0005
5 22.5 MT 22500.0000
6 1300.0 GM 1.3000
7 600.0 GM 0.6000
8 20.0 MT 20000.0000
如果要添加'KG'作为列值,请使用df['new_unit'] = 'KG'
您可以通过指定apply参数在行上使用axis
。像这样:
uom_map = {
'KG': 1,
'GM': .001,
'MT': 1000,
'LBS': 0.453592,
'MG': .000001,
}
def to_kg(row):
quantity, uom = row.quantity, row.uom
multiplier = uom_map[uom]
return quantity*multiplier
df['quantity_kg'] = df.apply(to_kg, axis=1)