2017-08-29 3 views
1

トピックにあるすべてのソリューションを試しましたが、それらはすべて「インプレース」のデータフレームには適用されず、乗算は行われませんでした。パンダの条件付き値の乗算

ここに私がやろうとしていることがあります。 私は多レベルの列データフレームを多くの測定値で持っています。すべてのカラムは次のように命じている。

データ:

    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ですべての値をフィルタリングする必要がある、単位はm/sのセンチメートル/秒ですべての測定値を変換しようとしていますそれらを10倍してから、[Unit]列の[Unit]を変更します。

私はフィルターを管理しましたが、* 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列のシリーズを与える:ここで

はコードです。多分、別の構造が助けになるでしょうか?

を使用でき
+1

は、[最初の答え]の内容を行います(https://stackoverflow.com/questions/ 20625582 /パンダでのコピーウォーニングの設定方法)は役に立ちますか?要素へのアクセスに問題があります。 'df.loc [conditions]'を使用するのをやめてください。 – Quickbeam2k1

+0

私のコメントが更新されました。項目にアクセスするために 'loc'を使用し、括弧をつけません。 – Quickbeam2k1

+0

ありがとう、実際にはこれが問題を解決しました! @ Quickbeam2k1 – Moiraine24

答えて

2

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