2017-01-14 4 views
1

の列をフィルタリングするpd.read_csvを使用する方法:1 私はデータフレームとしてCSVファイルを読み込む必要があります。元のファイルはthisです。 私は2005年〜2015年のデータのみを読みたいと思います。そして、私はインデックスとして '国名'を追加する必要があります。 ここに私のコードです:私はデータフレームに関する二つの質問</strong></p> <p><strong>質問を持っているパンダ

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: Cannot compare types 'ndarray(dtype=float64)' and 'str'

がどのように私は私のコードを修正しますか?

質問:2 各国の過去10年間のGDPを計算する必要があります。これは、15カ国の平均的なGDPを降順でソートしたavgGDPというシリーズを返します。

どうすればいいのかわかりません。

この2つの質問にお手伝いできますか?ありがとう。

+0

*各国の過去10年間のGDPを計算する必要があります。* ...データセットではありませんか? – Parfait

答えて

3

は、インデックスとして設定国名値を置き換える考えてみましょう:平均GDPについては

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を実行することを検討します。しかし、これらの手順は、指定された列ではなくインデックス(そうコメントアウト)として国名が必要になります。

:大陸と地域GDPの合計だけではなく国があるので

# 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 

そして、いくつかのクリーンアップが必要です

+0

ご返信ありがとうございます。あなたの方法では、ある部分から別の部分にcsvファイルを読み込む方法を理解することができました。 @パーフェクト – Edward

2

あなたはこれを行うことができますが、これにはpandas_datareaderパッケージを使用することをお勧めします。そのWebページのガイドに従って、インストールすることができます。あなたはそれがインストールされてしまったら、あなたが望む結果を得るために、以下を使用することができます。

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パッケージが本当に便利です。

こちらがお役に立てば幸いです。

+1

それは素晴らしいです!私は 'pandas_datareader'が'世界銀行 'のデータを解析できるのか分からなかった。 – MaxU

+0

Datareaderは使いやすいです!ありがとうございました – Edward

+0

@Edward試してみてください。余分な地域を除いて、国だけのデータを取得できます。 – Abdou

関連する問題