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

时间:2017-12-28 10:27:18

标签: python python-2.7 pandas numpy 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

但是如果我们有一个非常大的数据帧,我不认为循环它将是一个很好的方法来做到这一点。

我能以更好的方式做同样的事吗? 我也在尝试使用List Comprehension,但是无法使用它。

2 个答案:

答案 0 :(得分:3)

使用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'

答案 1 :(得分:1)

您可以通过指定axis参数在行上使用apply。像这样:

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)