Как складывать столбик с поплавками - PullRequest
2 голосов
/ 24 мая 2019

Этот код работал, пока я не обновил свой python 2.x до 3.x. У меня есть df, состоящий из 3 столбцов ipk1, ipk2, ipk3. ipk1, ipk2, ipk3, состоящий из чисел с плавающей точкой 0 - 4.0, Я хотел бы объединить их в строку.

Данные выглядят примерно так:

    ipk1    ipk2    ipk3    ipk4    ipk5    jk
0   3.25    3.31    3.31    3.31    3.34    P
1   3.37    3.33    3.36    3.33    3.41    P
2   3.41    3.47    3.59    3.55    3.60    P
3   3.23    3.10    3.05    2.98    2.97    L
4   3.24    3.40    3.22    3.23    3.25    L

на python 2.x этот код работает, но после обновления до python 3 это не так. Есть ли другой способ поместить его в строку? Я пытался использовать, хотя это тоже ничего не помогает.

train1.loc[train1['ipk1'] > 3.6, 'ipk1'] = 'A',
train1.loc[(train1['ipk1']>3.2) & (train1['ipk1']<=3.6),'ipk1']='B',
train1.loc[(train1['ipk1']>2.8) & (train1['ipk1']<=3.2),'ipk1']='C',
train1.loc[(train1['ipk1']>2.4) & (train1['ipk1']<=2.8),'ipk1']='D',
train1.loc[(train1['ipk1']>2.0) & (train1['ipk1']<=2.4),'ipk1']='E',
train1.loc[(train1['ipk1']>1.6) & (train1['ipk1']<=2.0),'ipk1']='F',
train1.loc[(train1['ipk1']>1.2) & (train1['ipk1']<=1.6),'ipk1']='G',
train1.loc[train1['ipk1'] <= 1.2, 'ipk1'] = 'H' 

Я получаю ошибку:

TypeError: '>' not supported between instances of 'str' and 'float'

Мой ожидаемый результат:

    ipk1    ipk2    ipk3    ipk4    ipk5    jk
0   B       3.31    3.31    3.31    3.34    P
1   B       3.33    3.36    3.33    3.41    P
2   B       3.47    3.59    3.55    3.60    P
3   B       3.10    3.05    2.98    2.97    L
4   B       3.40    3.22    3.23    3.25    L

Ответы [ 2 ]

2 голосов
/ 24 мая 2019

Вы можете сделать это намного проще, используя pd.cut.Вот как вы можете это сделать:

bins = [float('-inf'),1.2,1.6,2.,2.4,2.8,3.2,3.6,float('inf')]
labels = ['H','G','F','E','D','C','B','A']

df['ipk1'] = pd.cut(df.ipk1, bins=bins, labels=labels)

print(df)

   ipk1  ipk2  ipk3  ipk4  ipk5 jk
0    B  3.31  3.31  3.31  3.34  P
1    B  3.33  3.36  3.33  3.41  P
2    B  3.47  3.59  3.55  3.60  P
3    B  3.10  3.05  2.98  2.97  L
4    B  3.40  3.22  3.23  3.25  L
2 голосов
/ 24 мая 2019

Это хороший вариант использования для pandas.cut:

bins = [-np.inf, 1.2, 1.6, 2.0, 2.4, 2.8, 3.2, 3.6, np.inf]
labels = ['H', 'G', 'F', 'E', 'D', 'C', 'B', 'A']

df['ipk1'] = pd.cut(df['ipk1'], bins=bins, labels=labels)
...