熊猫在位条件值乘法
问题描述:
我已经尝试过所有关于该主题的解决方案,它们都不适用于数据帧“inplace”,乘法从未发生过。熊猫在位条件值乘法
所以这里是我想要做的: 我有一个多级列数据帧与许多测量。每一列都被命令是这样的:
数据:
MeasurementType
Value Unit Type
StudyNumber
1 1.0 m/s a
2 1.7 m/s v
3 10.5 cm/s b
我想所有的测量转换,单位米/秒至厘米/秒,即我需要单位米/秒过滤所有值,将它们乘以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
过滤器给了我一个系列的值列。也许另一个结构会有帮助?
答
您可以使用:
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
答
另一种方式:
# 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')
做的[第一个答案]的内容(https://stackoverflow.com/questions/ 20625582 /如何处理与设置在熊猫copywarning)帮助?您访问的元素看起来有问题。尝试使用loc,并尝试避免'df [] [] []'而不是'df.loc [conditions]' – Quickbeam2k1
我更新了我的评论,使用'loc'访问项目并且不链接括号 – Quickbeam2k1
谢谢,实际上这解决了问题! @ Quickbeam2k1 – Moiraine24