【问题标题】:Pandas inplace conditional value multiplicationPandas 代替条件值乘法
【发布时间】:2017-08-29 08:05:52
【问题描述】:

我已经尝试了所有我能找到的关于该主题的解决方案,所有这些都不适用于“就地”数据框,并且乘法从未发生过。

所以这就是我想要做的: 我有一个包含许多测量值的多级列数据框。每列的顺序如下:

数据:

                   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

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

【问题讨论】:

  • first answer 的内容有帮助吗?您对元素的访问看起来有问题。尽量使用loc,尽量避免使用df[][][],而是使用df.loc[conditions]
  • 我更新了我的评论,使用loc访问项目并且不要链接括号
  • 谢谢,实际上这解决了问题! @Quickbeam2k1
  • 我认为,由于重复链接,警告没有提出,虽然这看起来有点奇怪。很高兴我能帮上忙。请注意,您可以对 cme​​ts 和答案进行投票,并在合适的情况下接受答案。

标签: python pandas multiplication


【解决方案1】:

你可以使用:

print (data)
            MeasurementType            MeasurementType1           
                      Value  Unit Type            Value  Unit Type
StudyNumber                                                       
1                       1.0   m/s    a              1.0   m/s    a
2                       1.7   m/s    v              1.7  cm/s    v
3                      10.5  cm/s    b             10.5  mm/s    b

#get columns with Unit
unit_df = data.loc[:, data.columns.get_level_values(1)=='Unit']
print (unit_df)
            MeasurementType MeasurementType1
                       Unit             Unit
StudyNumber                                 
1                       m/s              m/s
2                       m/s             cm/s
3                      cm/s             mm/s

#create helper df with replace units by constants
#if value not in dict, get NaNs, so replaced by 1
d = {'m/s':10, 'mm/s':100}
df1 = unit_df.applymap(d.get).fillna(1).rename(columns={'Unit':'Value'})
print (df1)
            MeasurementType MeasurementType1
                      Value            Value
StudyNumber                                 
1                      10.0             10.0
2                      10.0              1.0
3                       1.0            100.0

#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

【讨论】:

    【解决方案2】:

    另一种方式:

    # 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')
    

    【讨论】:

      猜你喜欢
      • 2019-07-19
      • 1970-01-01
      • 2014-03-03
      相关资源
      最近更新 更多