2016-06-09 3 views
0

`импорт панд импорта NumpyКак классифицировать значения с плавающим в питоне с помощью панд библиотеки

#importing the dataset 
data=pandas.read_csv('gapminder.csv',low_memory=False) 

#setting variables to be worked with to numeric 
data['urbanrate']=data['urbanrate'].convert_objects(convert_numeric=True) 
data['femaleemployrate']=data['femaleemployrate'].convert_objects(convert_numeric=True) 
data['lifeexpectancy']=data['lifeexpectancy'].convert_objects(convert_numeric=True) 

print("Count for urbanrate") 
chk8=data['urbanrate'].value_counts(sort=False,dropna=False) 
print(chk8) 

sub1=data[['urbanrate','femaleemployrate','lifeexpectancy']] 
print (sub1.head(25)) 

=========================================================================== 
def urban (row): 
     if (row['urbanrate']<25.0): 
      return 1 
     if (data[['urbanrate']>=25.0 & data['urbanrate']<75.0]): 
     return 2 
     if (data['urbanrate']>75.0): 
     return 3 
sub1['urban']=sub1.apply(lambda row: urban (row),axis=1) 
print (sub1.head(25)) 
============================================================================` 

Я хочу, чтобы классифицировать все значения urbanrate (которые все числа с плавающей точкой, как 24.56, 88.98, 77.65) в 3 разные категории (одна - значения для <25, другая для >=25 and <75 и последняя для >=75) и сохраняйте эти значения в новой переменной (например, городской). Как я могу это сделать? Я дал свой код. Я выполнил это, и его дает мне ошибки как:

TypeError: ('cannot compare a dtyped [float64] array with a scalar of type [bool]', 'occurred at index 1'))

Пожалуйста, помогите мне

ответ

0

использование 3 маски:

sub1.loc[sub1['urbanrate']<25.0,'urban'] = 1 
sub1.loc[(sub1['urbanrate']>=25.0) & (sub1['urbanrate']<75.0),'urban'] = 2 
sub1.loc[sub1['urbanrate']>75.0,'urban'] = 3 

вы можете замаскировать те строки, которые удовлетворяют булево условие и установить все из них в том, что вы пробовали, потому что:

if (data[['urbanrate']>=25.0 & data['urbanrate']<75.0]): 
    return 2 

здесь вы пытаетесь сравнить массив wi го скалярного значения для получения скалярных булева, это не будет работать, кроме того, хотя вы использовали правильный оператор вам необходимо заключить условия в скобках ():

if (data[['urbanrate']>=25.0) & (data['urbanrate']<75.0]): 
    return 2 

Кроме того, ваша функция противоречива, вы назвали apply и прошел axis=1 это означает, что вы пытаетесь работать на значении строки и ваше первое условие хорошо:

if (row['urbanrate']<25.0): 
      return 1 

, но в последующих условиях вы тестируете весь Series который полностью отличается

Если вы сделали следующее он работал бы:

def urban (colData): 
    if colData<25.0: 
     return 1 
    if (colData>=25.0) & (colData<75.0]): 
     return 2 
    if (colData>75.0): 
     return 3 
sub1['urban']=sub1['urbanrate'].apply(urban) 

не надо было работать по рядам здесь, вы можете пройти весь столбец/серии как арг вашей функции

+0

'sUB1 [ 'городской'] = sUB1 [ 'городской'] применяются (городской)' Теперь показывает ошибку в этой строке, KeyError: urban.I я не в состоянии выясните это. – user3400176

+0

Hmm try 'sub1 ['urban'] = sub1 ['urbanrate'] применить (городской)' – EdChum

1

Я думаю, что вы можете использовать pd.cut:.

import pandas as pd 

df = pd.DataFrame({'urbanrate':[10,20,25,30,40,75,80,100]}) 
print (df) 
    urbanrate 
0   10 
1   20 
2   25 
3   30 
4   40 
5   75 
6   80 
7  100 

bins = [0, 24.999, 74.999, 1000] 
group_names = [1,2,3] 
df['urban'] = pd.cut(df['urbanrate'], bins, labels=group_names) 
print (df) 
    urbanrate urban 
0   10  1 
1   20  1 
2   25  2 
3   30  2 
4   40  2 
5   75  3 
6   80  3 
7  100  3