使用熊猫处理csv文件时,在处理null或NaN类型时遇到错误

时间:2019-05-29 07:21:04

标签: python excel pandas

我正在尝试将所有国家/地区ISO代码替换为完整国家/地区名称,以使所有内容保持一致,这是清理某些数据的一部分。我设法找到了pycountry包,可以帮上大忙! CSV文件中的某些字段为空,我认为在下面运行我的代码时会引起一些问题。

另外,还有一个问题,不确定是不是我,但是CSV有时会将空文件读取为null / 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')

但是,我正在研究的“国籍”列中不应有任何浮点类型值。我猜这仅仅是空/空/ NaN值被认为是浮点型?

2 个答案:

答案 0 :(得分:0)

一个想法是先通过Series.dropna删除misisng值,然后使用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

答案 1 :(得分:0)

要注意的一件事是,当pandas从数据源读取数据并尝试自动将数据类型分配给列时,有时它会分配与您期望的数据类型不同的数据类型,具体取决于是否存在空值还是不在数据源中。

一个经典的例子是将整数值转换为浮点值。

如果您的CSV文件具有准确的内容(请注意A列第2行中缺少值):

ColA,ColB
0,2
,1
5,4

然后使用

读取文件
res_df=pandas.read_csv(filename)

将创建一个数据框,该数据框的A列为浮点数,B列为整数。 这是因为没有一种规范的方法可以将“空”值分配给整数,而浮点数只能设置为NaN(而不是数字)。

但是,如果存在该值,您将获得2列整数。

只是需要注意的一点,因为它很容易被遗忘,然后突然在代码中出现浮点数而不是整数,对此感到困惑。