2017-04-21 5 views
1

Ich benutze Pandas und Numpy, um meine CSV-Dateien zu durchsuchen, das Problem ist, dass zum Beispiel, wenn ich nach 'foo' suche und der Wert 'foo1' ist, es immer noch wahr zurückgibt. Wie kann ich nur nach 'foo' suchen und sonst nichts? Ich suche die bestimmte Zeile, aber der Wert wird gelegentlich nur eine Nummer am Ende hinzufügen, wie 'foo' wird zu 'foo1' oder 'foo2' ändern und ich kann das nicht wirklich ändern. Hier ist mein Code ist:Nur nach exakten Werten in CSV Python 2.7 suchen?

df = pd.read_csv('MyFile.csv') 
x = np.where((df['Name'] == name) & (df['Num'] == 'foo')) 
try: 
    if (x[0][0] + 1) > 0: #also if someone has a better method 
     return True  #for returning True please let me know 
except IndexError: 
    return False 
+0

Was meinen Sie, wenn Sie sagen, Sie „Suchen der bestimmten Zeile“ sind? Welche Art von Ausgabe möchten Sie? – ASGM

+0

Zeigen Sie uns ein Beispiel der 'df ['Num']' Spalte und geben Sie an, welche Elemente Sie suchen möchten. Möchten Sie Zeilen beibehalten oder ausschließen, in denen 'df [' Num '] ==' foo1' 'steht? Ich verstehe auch nicht den Zweck dieses 'x [0] [0]' Tests. – hpaulj

+0

@hpaulj Ich versuche, eine CSV nach einem Namen zu suchen und zu überprüfen, ob ihre Num die gleiche ist, als sie das letzte Mal das Skript ausgeführt hatte. Wenn es dasselbe ist, möchte ich True zurückgeben, und wenn es sich geändert hat, möchte ich False zurückgeben. Wenn die Num jedoch auf "foo1" geändert wird, wird True zurückgegeben, obwohl sie geändert wurde. Für den x [0] [0] -Test verwende ich dies nur als einen Weg, um zu sehen, ob x gefunden wurde. Es gibt mir die Zeile # in einem Array, und [0] [0] gibt mir die Zeile # als Str, und dann füge ich eins hinzu, weil es die Kopfzeile nicht berücksichtigt. Ich bin mir sicher, dass es einen einfacheren Weg gibt, aber IDK von einem. – Ecom1414

Antwort

1

Für foo und foo nur Sie tun können:

df = pd.DataFrame({"a":["foo","bar","foobar"]}) 
df 
    a 
0 foo 
1 bar 
2 foobar 

df["a"].str.contains("^foo$") 
0  True 
1 False 
2 False 
Name: a, dtype: bool 
+0

@ Ecom1414 Warum nicht die Antwort akzeptieren, wenn es für Sie funktioniert? –

0

Ich denke, Ihre Lösung funktionieren würde, nur np.where notwendig auslassen:

df = pd.DataFrame({'Num':['foo', 'foo1', 'foow'], 'Name':['name1','name1','name3']}) 

print (df) 
    Name Num 
0 name1 foo 
1 name1 foo1 
2 name3 foow 

name = 'name1' 
mask = (df['Name'] == name) & (df['Num'] == 'foo') 
print (mask) 
0  True 
1 False 
2 False 
dtype: bool 

Wenn Bedarf skalare Ausgabe hinzufügen any für überprüfen mindestens eine True:

val = ((df['Name'] == name) & (df['Num'] == 'foo')).any() 
print (val) 
True 

Oder wenn Notwendigkeit, alle Werte überprüfen, ob Trueall hinzufügen:

df = pd.DataFrame({'Num':['foo', 'foo'], 'Name':['name1','name1']}) 

print (df) 
    Name Num 
0 name1 foo 
1 name1 foo 

name = 'name1' 
val = ((df['Name'] == name) & (df['Num'] == 'foo')).all() 
print (val) 
True 
Verwandte Themen