2016-05-24 4 views
2

私の目標は、「年」列の各値を適切な列の年(つまり1999,2000)と比較することです。私は対応する列から対応する値を返したいと思います。たとえば、2004年のアフガニスタン(1行目)では、「2004」という名前の列を見つけて、アフガニスタンを含む行から値を返したいと考えています。df列を反復し、行インデックス、列参照に基づいてデータフレーム内の値を返す

ここに表があります。参考のために、この表は、1999年から2010年までの1年間の教育達成度と国ごとのgdp表との間のSQL結合の結果です。私の最終的な目標は、教育データの元年からgdpを返すことです。

country year men_ed_yrs women_ed_yrs total_ed_yrs 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 
0 Afghanistan 2004 11 5 8 NaN NaN 2461666315 4128818042 4583648922 5285461999 6.275076e+09 7.057598e+09 9.843842e+09 1.019053e+10 1.248694e+10 1.593680e+10 
1 Albania 2004 11 11 11 3414760915 3632043908 4060758804 4435078648 5746945913 7314865176 8.158549e+09 8.992642e+09 1.070101e+10 1.288135e+10 1.204421e+10 1.192695e+10 
2 Algeria 2005 13 13 13 48640611686 54790060513 54744714110 56760288396 67863829705 85324998959 1.030000e+11 1.170000e+11 1.350000e+11 1.710000e+11 1.370000e+11 1.610000e+11 
3 Andorra 2008 11 12 11 1239840270 1401694156 1484004617 1717563533 2373836214 2916913449 3.248135e+09 3.536452e+09 4.010785e+09 4.001349e+09 3.649863e+09 3.346317e+09 
4 Anguilla 2008 11 11 11 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 

gdp_ed_list = [] 
for value in df_combined_column_named['year']: #loops through each year in year column 
     if value in df_combined_column_named.columns: #compares year to column names 
      idx = df_combined_column_named[df_combined_column_named['year'][value]].index.tolist() #supposed to get the index associated with value 
      gdp_ed = df_combined_column_named.get_value(idx, value) #get the value of the cell found at idx, value 
      gdp_ed_list.append(gdp_ed) #append to a list 

現在、コードがindex.list()セクションでスタックしています。エラーを返します:

--------------------------------------------------------------------------- 
KeyError         Traceback (most recent call last) 
<ipython-input-85-361acb97edd4> in <module>() 
     2 for value in df_combined_column_named['year']: #loops through each year in year column 
     3  if value in df_combined_column_named.columns: #compares year to column names 
----> 4   idx = df_combined_column_named[df_combined_column_named['year'][value]].index.tolist() 
     5   gdp_ed = df_combined_column_named.get_value(idx, value) 
     6   gdp_ed_list.append(gdp_ed) 
KeyError: u'2004' 

どのような考えですか?

答えて

2

year列の値を列ラベルに一致させて、対応するセルの値を抽出しようとしているようです。あなたは行をループすることでそれを行うことができます(下記参照)が、私はそれが最速の方法ではないと思う。 代わりに、あなたは、たとえば、単一の列に今年のようなラベルで列を合体するyear_colpd.meltを使用することができます。

In [38]: melted = pd.melt(df, id_vars=['country', 'year', 'men_ed_yrs', 'women_ed_yrs', 'total_ed_yrs'], var_name='year_col') 

In [39]: melted 
Out[39]: 
     country year men_ed_yrs women_ed_yrs total_ed_yrs year_col   value 
0 Afghanistan 2004   11    5    8  1999   NaN 
1  Albania 2004   11   11   11  1999 3.414761e+09 
2  Algeria 2005   13   13   13  1999 4.864061e+10 
3  Andorra 2008   11   12   11  1999 1.239840e+09 
4  Anguilla 2008   11   11   11  1999   NaN 
5 Afghanistan 2004   11    5    8  2000   NaN 
... 

このように、データフレームを「融解」の利点は、今あなたが持っているだろう ということですyearおよびyear_colの両方の列。 あなたが探している値は、yearyear_colと等しい行にあります。そして、それは.locを使用することによって得ることが容易である:

In [41]: melted.loc[melted['year'] == melted['year_col']] 
Out[41]: 
     country year men_ed_yrs women_ed_yrs total_ed_yrs year_col \ 
25 Afghanistan 2004   11    5    8  2004 
26  Albania 2004   11   11   11  2004 
32  Algeria 2005   13   13   13  2005 
48  Andorra 2008   11   12   11  2008 
49  Anguilla 2008   11   11   11  2008 

      value 
25 5.285462e+09 
26 7.314865e+09 
32 1.030000e+11 
48 4.001349e+09 
49   NaN 

したがって、上げKeyErrorたなぜあなたは

import numpy as np 
import pandas as pd 
nan = np.nan 
df = pd.DataFrame({'1999': [nan, 3414760915.0, 48640611686.0, 1239840270.0, nan], 
'2000': [nan, 3632043908.0, 54790060513.0, 1401694156.0, nan], 
'2001': [2461666315.0, 4060758804.0, 54744714110.0, 1484004617.0, nan], 
'2002': [4128818042.0, 4435078648.0, 56760288396.0, 1717563533.0, nan], 
'2003': [4583648922.0, 5746945913.0, 67863829705.0, 2373836214.0, nan], 
'2004': [5285461999.0, 7314865176.0, 85324998959.0, 2916913449.0, nan], 
'2005': [6275076000.0, 8158549000.0, 103000000000.0, 3248135000.0, nan], 
'2006': [7057598000.0, 8992642000.0, 117000000000.0, 3536452000.0, nan], 
'2007': [9843842000.0, 10701010000.0, 135000000000.0, 4010785000.0, nan], 
'2008': [10190530000.0, 12881350000.0, 171000000000.0, 4001349000.0, nan], 
'2009': [12486940000.0, 12044210000.0, 137000000000.0, 3649863000.0, nan], 
'2010': [15936800000.0, 11926950000.0, 161000000000.0, 3346317000.0, nan], 
'country': ['Afghanistan', 'Albania', 'Algeria', 'Andorra', 'Anguilla'], 
'men_ed_yrs': [11, 11, 13, 11, 11], 
'total_ed_yrs': [8, 11, 13, 11, 11], 
'women_ed_yrs': [5, 11, 13, 12, 11], 
'year': ['2004', '2004', '2005', '2008', '2008']}) 

melted = pd.melt(df, id_vars=['country', 'year', 'men_ed_yrs', 'women_ed_yrs', 
           'total_ed_yrs'], var_name='year_col') 
result = melted.loc[melted['year'] == melted['year_col']] 
print(result) 

を使用することができます。KeyError

です起きているのはdf_combined_column_named['year'][value]value'2004'であるとします。次にdf_combined_column_named['year']は、年の文字列表現を含み、整数(0,1,2など)でインデックスされた系列です。 df_combined_column_named['year'][value]は、整数インデックスにない文字列'2004'でこのシリーズのインデックスを作成しようとするため、失敗します。


また、ここではiterrowsを使用して行をループで目標を達成するための別の方法があります。これを理解することは、おそらく単純であるが、一般的にiterrowsを使用してslow compared to other column-based Pandas-centric methodsです:

data = [] 
for idx, row in df.iterrows(): 
    data.append((row['country'], row['year'], row[row['year']])) 
result = pd.DataFrame(data, columns=['country', 'year', 'value']) 
print(result) 

プリント

 country year   value 
0 Afghanistan 2004 5.285462e+09 
1  Albania 2004 7.314865e+09 
2  Algeria 2005 1.030000e+11 
3  Andorra 2008 4.001349e+09 
4  Anguilla 2008   NaN 
+0

これらのソリューションの両方を提供するために時間を割いていただきまして誠にありがとうございます!私は2番目の実装に成功しました。さて、私は最初の解決策を理解するために、各行を進んでいます。 – Aschharwood

関連する問題