我正在尝试将所有国家/地区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值被认为是浮点型?
答案 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列整数。
只是需要注意的一点,因为它很容易被遗忘,然后突然在代码中出现浮点数而不是整数,对此感到困惑。