Python 3.x 使用np.where()检查pd.DataFrame处的条件,并将函数应用于多个列
假设数据帧df和其中的两列分别承载质量值和测量单位。这两列将如下所示: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.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'