Python 3.x 使用np.where()检查pd.DataFrame处的条件,并将函数应用于多个列

Python 3.x 使用np.where()检查pd.DataFrame处的条件,并将函数应用于多个列,python-3.x,pandas,numpy,dataframe,Python 3.x,Pandas,Numpy,Dataframe,假设数据帧df和其中的两列分别承载质量值和测量单位。这两列将如下所示: df.head() Mass Unit 0 14 g 1 1.57 kg 2 701 g 3 0.003 tn 4 0.6 kg 我希望有一个一致的测量系统,因此,我执行以下操作: df['Mass']=np.where(df['Unit']=='g', df['Mass']/1000, df['Mass']) #1 df['Unit']=np.whe

假设数据帧df和其中的两列分别承载质量值和测量单位。这两列将如下所示:

df.head()
    Mass  Unit
0     14     g
1   1.57    kg
2    701     g
3  0.003    tn
4    0.6    kg
我希望有一个一致的测量系统,因此,我执行以下操作:

df['Mass']=np.where(df['Unit']=='g', df['Mass']/1000, df['Mass'])  #1
df['Unit']=np.where(df['Unit']=='g', 'kg', df['Unit'])  #2

df['Mass']=np.where(df['Unit']=='tn', df['Mass']*1000, df['Mass'])  #3
df['Unit']=np.where(df['Unit']=='tn', 'kg', df['Unit'])  #4
a) 是否有一种方法可以在一行中执行#1和#2,可以使用
apply
? b) 是否可以只在一行中执行#1、#2、#3和#4

谢谢你抽出时间

这是可能的,但因为
Mass
中的数值和字符串列数值转换为字符串,所以最后一步是转换为浮点:

df['Mass'],df['Unit'] = np.select([df['Unit']=='g', df['Unit']=='tn'], 
                                [(df['Mass']/1000, np.repeat(['kg'], len(df))),
                                 (df['Mass']*1000, np.repeat(['kg'], len(df)))], 
                                (df['Mass'],df['Unit']))
df['Mass'] = df['Mass'].astype(float)
print (df)
    Mass Unit
0  0.014   kg
1  1.570   kg
2  0.701   kg
3  3.000   kg
4  0.600   kg
同样的问题:


您可以执行以下不使用任何numpy函数的操作

(i,j) = (df[(df['Unit']=='g')].index, df[(df['Unit']=='tn')].index)    
df.loc[i,'Mass'], df.loc[j,'Mass'], df['Unit'] = df.loc[i,'Mass']/1000, df.loc[j,'Mass']*1000,'kg'

谢谢,我喜欢这两种解决方案:我不知道那种操作,比如将两列分开。我需要更彻底地检查一下。
(i,j) = (df[(df['Unit']=='g')].index, df[(df['Unit']=='tn')].index)    
df.loc[i,'Mass'], df.loc[j,'Mass'], df['Unit'] = df.loc[i,'Mass']/1000, df.loc[j,'Mass']*1000,'kg'