考虑我有以下dataframe
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
但是,如果我们有一个非常大的数据框架,我认为循环循环是这样做的好方法。
我可以以更好的方式做类似的事情吗?我还尝试了列表理解,但无法使用它。
使用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'
您可以通过指定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)