Pandas inplace条件值乘法

时间:2017-08-29 08:05:52

标签: python pandas multiplying

我已经尝试了所有可以在这个主题上找到的解决方案,所有这些解决方案都不适用于数据帧" inplace"乘法从未发生过。

所以这就是我想要做的: 我有一个多级列数据帧,有许多测量。每列的订购方式如下:

数据:

                   MeasurementType
                   Value Unit Type
    StudyNumber 
             1     1.0   m/s   a
             2     1.7   m/s   v
             3     10.5  cm/s  b

我试图将单位m / s的所有测量值转换为cm / s,即我需要用单位m / s过滤所有值,将它们乘以10然后更改单位列中的单位。

我管理过滤器,但是当我对它进行乘法时(直接按* 10,.mul(10),或者进行新的赋值),它并不坚持。之后打印数据帧显示值没有变化。

以下是代码:

    unit_df = data.iloc[:, data.columns.get_level_values(1)=='Unit']


    unit_col_list = []
    for unitcol in unit_df.columns:
        unitget = unit_df[unitcol][unit_df[unitcol].notnull()].unique()
        if unitget.size > 1:
            unit_col_list.append(unitcol)


    unit_col_list =  [item[0] for item in unit_col_list] #so I get the header of the column 
    data_wrongunits = data[unit_col_list]


data_wrongunits[unit_col_list[0]][data_wrongunits[unit_col_list[0]]['Unit'] == 'm/s']['Value']*=10

data_wrongunits[unit_col_list[0]][data_wrongunits[unit_col_list[0]]['Unit'] == 'm/s']['Value'].mul(10)

data_wrongunits[unit_col_list[0]][data_wrongunits[unit_col_list[0]]['Unit'] == 'm/s']['Value']=data_wrongunits[unit_col_list[0]][data_wrongunits[unit_col_list[0]]['Unit'] == 'm/s']['Value']*10

过滤器为我提供了一系列Value列。也许另一种结构会有所帮助吗?

2 个答案:

答案 0 :(得分:2)

您可以使用:

#filter only Value columns and multiple by df1
data[df1.columns] = data[df1.columns].mul(df1)
print (data)
            MeasurementType            MeasurementType1           
                      Value  Unit Type            Value  Unit Type
StudyNumber                                                       
1                      10.0   m/s    a             10.0   m/s    a
2                      17.0   m/s    v              1.7  cm/s    v
3                      10.5  cm/s    b           1050.0  mm/s    b
{{1}}

答案 1 :(得分:1)

另一种方式:

# convert value
df.loc[df.Unit=='m/s', 'Value'] = \
    df.loc[df.Unit=='m/s', 'Value'].mul(100)  #!

# change unit
print df.set_value(df.Unit=='m/s', 'Unit', 'cm/s')