如何将数据帧中的混合测量值转换为统一的测量值



我有一个数据帧,有两列a和B,

import pandas as pd
import numpy as np
df = pd.DataFrame({
'A':[1,3,7,19,80,120,14,2],
'B':['years','years','months','months','days','days','months','years',]
})

我想用"年"的统一度量来更改的值,如:

df = pd.DataFrame({
'A':[1,3,0.58,1.58,0.22,0.33,1.17,2],
'B':['years','years','years','years','years','years','years','years']
})

我用以下代码尝试了,但我得到了(ValueError:序列的真值不明确。请使用a.empty、a.bool((、a.item((、.any((或.all((。(

for x in df.B:
if x== 'days':
df['A']=df['A'].div(365).round(2)
elif x== 'months':
df['A']=df['A'].div(12).round(2)
else:
pass

您可以使用np.select来分配值,其中对于对应于"B"=="月";,将";A";值乘以12;B"=="天";,将";A";值乘以365,以及所有其他情况,保持原样:

import numpy as np
df['A'] = np.select([df['B']=='months', df['B']=='days'], [df['A'].div(12), df['A'].div(365)], df['A']).round(2)
df['B'] = 'years'

输出:

A      B
0  1.00  years
1  3.00  years
2  0.58  years
3  1.58  years
4  0.22  years
5  0.33  years
6  1.17  years
7  2.00  years

到目前为止,@enke提供了更可扩展的方法,但我想我会对您的方法进行修复,以说明在df上迭代的首选方法。您希望使用panda内置方法之一,如iterrows,而不仅仅是一个常规的for循环。请注意,这使用了两个迭代变量,而不是一个。然而,在以这种方式迭代之前,如果可能的话,建议使用矢量化方法,因为它要快得多。

years_list = []
for idx, row in df.iterrows():
if row['B'] == 'days':
years_list.append(row['A'] / 365)
elif row['B'] == 'months':
years_list.append(row['A'] / 12)
elif row['B'] == 'years':
years_list.append(row['A'])
else:
pass

df['years'] = years_list
df = df.round(2)

最新更新