标准化数据框中的测量单元



考虑我有以下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

但是,如果我们有一个非常大的数据框架,我认为循环循环是这样做的好方法。

我可以以更好的方式做类似的事情吗?我还尝试了列表理解,但无法使用它。

使用dictmultiply映射值,即

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)

最新更新