首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用pd.read_csv过滤Pandas中的列

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

Stack Overflow用户
提问于 2017-01-14 02:01:50
回答 2查看 1.3K关注 0票数 1

我有两个关于dataframe的问题

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

代码语言:javascript
复制
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年的国内生产总值。这应该是返回一个名为avgGDP的系列,15个国家和它们的平均国内生产总值按降序排序。

我不知道该怎么做。

男人们能帮忙回答这两个问题吗?谢谢。

EN

回答 2

Stack Overflow用户

发布于 2017-01-14 02:49:42

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

代码语言:javascript
复制
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')

至于平均国内生产总值,考虑将数据与melt合并成长格式,然后运行groupby。然而,这些步骤要求国名作为命名列而不是索引(因此注释掉):

代码语言:javascript
复制
# 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总量,而不仅仅是国家:

票数 4
EN

Stack Overflow用户

发布于 2017-01-14 02:58:34

您可以这样做,但我建议您为此使用pandas_datareader包。您可以按照该网页上的指南安装它。一旦安装了它,就可以使用下面的内容来获得所需的东西:

代码语言:javascript
复制
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

你仍然可以按你自己的方式去做,但你可能需要做更多的工作:

代码语言:javascript
复制
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包在这里非常方便。

我希望这能帮到你。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41646058

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档