Получение ошибок при работе с нулевым или NaN-типом при работе с CSV-файлами с пандами - PullRequest
1 голос
/ 29 мая 2019

Я пытаюсь заменить все коды ISO стран на Полные названия стран, чтобы все было согласованно, как часть очистки некоторых данных. Мне удалось найти пакет pycountry, который очень помогает! В CSV-файле есть несколько пустых полей, которые, как мне кажется, вызывают некоторые проблемы при запуске моего кода ниже.

Кроме того, дополнительный вопрос, не уверен, что это только я, но бывают случаи, когда CSV читает пустые файлы как ноль / NaN или просто пусто. Я действительно не знаю, что там пошло не так, но, если возможно, я хотел бы изменить все эти пустые ячейки в одну «вещь» или тип для простоты фильтрации / удаления.

df = pd.read_csv("file.csv")
#use pycountry to match the Nationalities as actual country names
import pycountry
list_alpha_2 = [i.alpha_2 for i in list(pycountry.countries)]
list_alpha_3 = [i.alpha_3 for i in list(pycountry.countries)]

def country_flag(df):
    if (len(df['Nationality'])==2 and df['Nationality'] in list_alpha_2):
        return pycountry.countries.get(alpha_2=df['Nationality']).name
    elif (len(df['Nationality'])==3 and df['Nationality'] in list_alpha_3):
        return pycountry.countries.get(alpha_3=df['Nationality']).name
    elif (len(df['Nationality'])>3):
        return df['Nationality']
    else:
        return '#N/A'

df['Nationality']=df.apply(country_flag,axis =1)
df

Я ожидал, что результат будет примерно таким:

0   AF  100 Afghanistan

1           #N/A

2   AUS 140 Australia

3    Germany    400 Germany

Я получаю сообщение об ошибке

TypeError: ("object of type 'float' has no len()", 'occurred at index 0')

Тем не менее, в столбце «Национальность», над которым я работаю, не должно быть значений типа float. Я предполагаю, что это просто пустые / нулевые / NaN-значения, считающиеся типом с плавающей запятой?

Ответы [ 2 ]

0 голосов
/ 29 мая 2019

Следует обратить внимание на то, что когда pandas читает данные из источника данных и пытается автоматически назначить тип данных столбцу, он иногда назначает тип данных, отличный от того, который вы ожидаете, в зависимости от наличия пустых значений.или нет в источнике данных.

Классическим примером являются целочисленные значения, которые преобразуются в значения с плавающей запятой.

Если у вас есть файл CSV с этим точным содержимым (обратите внимание на отсутствующее значение в строке 2столбец A):

ColA,ColB
0,2
,1
5,4

, затем чтение файла с помощью

res_df=pandas.read_csv(filename)

создаст кадр данных с плавающей точкой в ​​столбце A и целыми числами в столбце B. Это связано с тем, чточто нет канонического способа присвоить «пустое» значение целому числу, тогда как число с плавающей запятой можно просто установить как NaN (не число).

Но если бы это значение присутствовало, вы бы получили 2 столбцацелых чисел.

Просто что-то, о чем нужно знать, так как об этом можно легко забыть, и вдруг в вашем коде появляются числа с плавающей точкой вместо целых чисел изапутался по этому поводу.

0 голосов
/ 29 мая 2019

Одна идея - сначала удалить ошибочные значения с помощью Series.dropna и использовать Series.apply:

print (df)
  Nationality
0          AF
1         NaN
2         AUS
3     Germany

import pycountry
list_alpha_2 = [i.alpha_2 for i in list(pycountry.countries)]
list_alpha_3 = [i.alpha_3 for i in list(pycountry.countries)]

def country_flag(x):
    if (len(x)==2 and x in list_alpha_2):
        return pycountry.countries.get(alpha_2=x).name
    elif (len(x)==3 and x in list_alpha_3):
        return pycountry.countries.get(alpha_3=x).name
    elif (len(x)>=3):
        return x
    else:
        return np.nan

df['Nationality'] = df['Nationality'].dropna().astype(str).apply(country_flag)
print (df)
   Nationality
0  Afghanistan
1          NaN
2    Australia
3      Germany
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...