2016-06-19 13 views
0

Ich betreibe Anaconda unter OS X 10.11.5 und kämpfe um den Zugriff auf Daten in einem Pandas DataFrame. Es funktioniert zwar direkt, aber wenn ich versuche, Argumente in einer Zeichenfolge zu bewerten, die ich durch Iteration generiert habe, schlägt es fehl. Hier ist eine einfachere Version, die das gleiche Problem ohne die Iteration erzeugt.Python - warum schlägt eval bei diesem String/Ausdruck fehl?

Der direkte Zugang - das funktioniert gut:

from pandas import * 
df = read_csv('~/FutureLearn/Learn to Code for Data Analysis/WHO POP TB all.csv') 

df1 = (df['Country'] == 'Brazil') # Also works without() 
df1  # A pandas Series 
df[df1] # Accesses DataFrame OK 

Dies ist ein Versuch, in dem der Wähler als String erzeugt wird und dann ausgewertet:

df1str = ("df['Country'] == 'Brazil'") 
eval(df1str) # ValueError: unknown type str224 - would have expected Series 

Das die Valueerror erzeugt und ich kann nicht verwenden der Ausdruck für den Zugriff auf den DataFrame. Warum funktioniert das nicht eval? Oder was muss ich tun, um eine Zeichenfolge für den Zugriff auf den DataFrame verwenden zu können?

Danke für jede Hilfe (auf diese, meine erste StackOverflow Post).

+1

'df1str = ("df [ 'Country'] == 'Brazil'")' keine Ausgabe verwenden möchten, müssen Daten zurückgegeben oder ausgedruckt werden. Eval ist 'string' Basis nicht' None' oder 'Variable' Typ. Python ist keine magische Sprache! – dsgdfg

+0

wegen pandas import, wird nicht eval von pandas.eval shadowed? –

+0

@dsgdfg: 'type (df1str)' ist 'str' und die Variable gibt den zugewiesenen String-Wert zurück. Ich nahm an, dass ich eine Variable an "eval" und "mySum =" 1 + 2 "übergeben könnte; eval (mySum) 'funktioniert. – espri

Antwort

0

pandas.evalkehrt der Serie, so dass Sie

[email protected]:~/sandbox$ cat a.csv 
a,b 
1,2 
[email protected]:~/sandbox$ python 
Python 2.7.6 (default, Jun 22 2015, 17:58:13) 
[GCC 4.8.2] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import pandas 
>>> pandas.__version__ 
'0.13.1' 
>>> df = pandas.read_csv('a.csv') 
>>> df1str = "df['a'] == '1'" 
>>> df1 = pandas.eval(df1str) 
>>> type(df1) 
<class 'pandas.core.series.Series'> 
>>> 
+0

'@luv': das klang vielversprechend (wie von @joel goldstick), aber wenn ich versuchte 'df1str = ("df [' Country '] ==' Brazil '"); df1 = pandas.eval (df1str) 'Ich bekomme immer noch den gleichen ** ValueError ** (ich vermutete, du meintest' pandas.eval'). – espri

+0

Ich habe 'pandas.eval (df1str, parser = 'python') auch versucht, aber es brachte immer noch den gleichen ** ValueError **. – espri

+0

Seltsam. Ich habe es hier versucht (Python 2.7.6, Pandas 0.13.1) und es funktioniert für mich. Ich habe meine Antwort mit einem vollständigen Beispiel bearbeitet. – luv

Verwandte Themen