如何使用pd.read_csv过滤Pandas中的列

时间:2017-01-14 02:01:51

标签: python pandas dataframe

我有两个关于数据框架的问题

问题:1 我需要将csv文件作为DataFrame读取。原始文件为this。 我想只阅读2005~2015的数据。我需要添加“国家名称”作为索引。 这是我的代码:

import pandas as pd
import numpy as np
GPD = (pd.read_csv('world_bank.csv', skiprows=4, index_col='Country Name', usecols=(0,50,51,52,53,54,55,56,57,58,59))
  .replace({"Korea, Rep.": "South Korea", "Iran, Islamic Rep.": "Iran","Hong Kong SAR, China": "Hong Kong"}))

但我遇到错误:

  

TypeError:无法比较类型'ndarray(dtype = float64)'和'str'

如何更正我的代码?

问题:2 我需要计算每个国家过去10年的GDP。这应该返回一个名为avgGDP的系列,有15个国家,它们的平均GDP按降序排列。

我不知道怎么做。

人们可以帮助解决这两个问题吗?感谢。

2 个答案:

答案 0 :(得分:4)

考虑替换国家/地区名称值,然后将其设置为索引:

GDP = pd.read_csv('world_bank.csv', skiprows=4, usecols=[0] + list(range(50,60)))

GDP['Country Name'] = GDP['Country Name'].replace(to_replace=["Korea, Rep.", "Iran, Islamic Rep.", "Hong Kong SAR, China"],
                                                  value=["South Korea", "Iran", "Hong Kong"])    
GDP = GDP.set_index('Country Name')

至于平均GDP,请考虑将数据框与melt合并为长格式,然后运行groupby。但是,这些步骤需要国家/地区名称作为命名列而不是索引(因此已注释掉):

# GDP = GDP.set_index('Country Name')

mGDP = pd.melt(GDP, id_vars='Country Name', var_name='Year', value_name='GDP')

mGDP = mGDP.groupby(['Country Name'])['GDP'].agg({'AvgGDP':'mean'}).sort_values('AvgGDP', ascending=False)

#                                                           AvgGDP
# Country Name                                                    
# World                                               6.735456e+13
# High income                                         4.600995e+13
# OECD members                                        4.518469e+13
# Post-demographic dividend                           4.298146e+13
# IDA & IBRD total                                    2.208337e+13
# Europe & Central Asia                               2.155501e+13
# Low & middle income                                 2.135025e+13
# Middle income                                       2.104455e+13
# IBRD only                                           2.038699e+13
# European Union                                      1.748398e+13
# North America                                       1.723858e+13
# East Asia & Pacific                                 1.719137e+13
# Upper middle income                                 1.653071e+13
# United States                                       1.562297e+13
# Late-demographic dividend                           1.441396e+13
# Euro area                                           1.282312e+13
# East Asia & Pacific (excluding high income)         8.697876e+12
# East Asia & Pacific (IDA & IBRD countries)          8.681259e+12
# Early-demographic dividend                          8.418026e+12
# China                                               6.934351e+12
# Latin America & Caribbean                           5.146274e+12
# Japan                                               4.959066e+12

需要进行一些清理,因为有大陆和地区的GDP总量而不仅仅是国家:

答案 1 :(得分:3)

您可以按照自己的方式执行此操作,但我建议您使用pandas_datareader包。您可以按照该网页上的指南进行安装。安装好后,您可以使用以下内容获得所需内容:

from pandas_datareader import wb
import pandas as pd


# Get 2-character ISO country names
all_countries = [x for x in wb.country_codes if len(x) == 2]

df_list = []

for country in all_countries:
    try:
        df_list.append(wb.download(indicator='NY.GDP.MKTP.CD', country = country, start=2005, end=2015, errors='ignore'))
    except ValueError:
        pass


GDP = pd.concat(df_list)

print GDP.head()

#               NY.GDP.MKTP.CD
# country year                
# Andorra 2015             NaN
#         2014             NaN
#         2013    3.248925e+09
#         2012    3.146152e+09
#         2011    3.427023e+09

avgGDP = GDP.groupby(level=0).mean().sort_values(by='NY.GDP.MKTP.CD', ascending = False)

print avgGDP.head()

#                 NY.GDP.MKTP.CD
# country                       
# United States     1.539304e+13
# China             6.511771e+12
# Japan             4.923866e+12
# Germany           3.471651e+12
# United Kingdom    2.704811e+12

您仍然可以按照自己的方式进行操作,但您可能需要做更多的工作:

GDP1 = pd.read_csv('world_bank.csv', 
    skiprows=4, 
    index_col ='Country Name', 
    usecols=(0,50,51,52,53,54,55,56,57,58,59))

GDP1 = GDP1.reset_index().replace({'Country Name': {"Korea, Rep.": "South Korea", 
    "Iran, Islamic Rep.": "Iran",
    "Hong Kong SAR, China": "Hong Kong"}}).set_index('Country Name')

GDP1 = pd.melt(GDP1.reset_index(), 
    id_vars= 'Country Name', 
    var_name='Year', 
    value_name='GDP').set_index(['Country Name','Year'])

avgGDP1 = GDP1.groupby(level=0).mean().sort_values(by='GDP', ascending = False)

print avgGDP1.head()

#                                     GDP
# Country Name                           
# World                      6.735456e+13
# High income                4.600995e+13
# OECD members               4.518469e+13
# Post-demographic dividend  4.298146e+13
# IDA & IBRD total           2.208337e+13

正如您所看到的,通过直接下载文件来获取输出要困难得多。所以pandas_datareader包在这里非常方便。

我希望这会有所帮助。