2016-05-24 4 views
2

Mein Ziel ist es, jeden Wert aus der Spalte "Jahr" mit dem entsprechenden Spaltenjahr (d. H. 1999, 2000) zu vergleichen. Ich möchte dann den entsprechenden Wert aus der entsprechenden Spalte zurückgeben. Für Afghanistan (erste Zeile), Jahr 2004, möchte ich beispielsweise die Spalte "2004" suchen und den Wert aus der Zeile zurückgeben, die Afghanistan enthält.Iterieren durch df-Spalte und Rückgabewert im Datenframe basierend auf Zeilenindex, Spaltenreferenz

Hier ist die Tabelle. Als Referenz ist diese Tabelle das Ergebnis einer sql-Verbindung zwischen dem Bildungsniveau in einem einzelnen definierten Jahr und einer Tabelle für BIP pro Land für die Jahre 1999 - 2010. Mein Endziel ist es, das BIP aus dem Jahr zurückzugeben, aus dem die Bildungsdaten stammen.

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 

Derzeit ist mein Code im Bereich index.list() stecken geblieben. Es gibt den Fehler zurück:

--------------------------------------------------------------------------- 
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' 

Irgendwelche Gedanken?

Antwort

2

Es sieht so aus, als ob Sie versuchen, den Wert in der Spalte mit Spaltenbeschriftungen abzugleichen und dann den Wert in den entsprechenden Zellen zu extrahieren. Sie könnten das tun, indem Sie die Zeilen durchlaufen (siehe unten), aber ich denke, es wäre nicht der schnellste Weg. Stattdessen könnten Sie pd.melt die Spalten mit ganz wie Etiketten in einer einzigen Spalte zu vereinigen, sagen wir, year_col:

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 
... 

Der Vorteil von „Schmelzen“ der Datenrahmen auf diese Weise ist, dass jetzt würden Sie beide year und year_col Spalten. Die Werte, nach denen Sie suchen, sind in den Zeilen, in denen yearyear_col entspricht. Und das ist einfach durch .loc Verwendung zu erhalten:

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 

So Sie

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) 

nutzen könnten Warum wurde ein KeyError angehoben:

Die KeyError ist vonangehoben werden. Angenommen value ist '2004'. Dann ist df_combined_column_named['year'] eine Reihe, die Stringdarstellungen von Jahren enthält und durch Ganzzahlen indiziert wird (wie 0, 1, 2, ...). df_combined_column_named['year'][value] schlägt fehl, weil es versucht, diese Serie mit der Zeichenfolge '2004' zu indexieren, die nicht im Integer-Index enthalten ist. mit iterrows


Alternativ hier ist ein weiterer Weg, um das Ziel von Looping durch die Reihen zu erreichen. Dies ist vielleicht einfacher zu verstehen, aber im Allgemeinen iterrows Verwendung ist 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) 

drucken

 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

Vielen Dank für die Zeit nehmen, diese beiden Lösungen anbieten zu können! Ich habe den zweiten erfolgreich umgesetzt.Jetzt arbeite ich mich durch jede Zeile, um sicherzustellen, dass ich die erste Lösung verstehe. – Aschharwood

Verwandte Themen