2016-09-15 3 views
-1

ich einen Datenrahmen haben, die wie folgt aussieht:identifizieren bestimmte Zeichenketten enthalten Zellen und überschreiben Inhalt mit Zahlen Python

enter image description here

für jede Zelle

Mein Ziel jeder Spalte enthalten sind, wenn die folgenden Zeichenfolgen zu identifizieren : 'KSS', 'ABC', 'DEF', 'ABC/DEF', 'KSS/DEF'

Anschließend würde Ich mag den Inhalt mit den folgenden Werten ersetzen: 'KSS' -> 100, 'ABC' -> 200, 'DEF' -> 300, 'ABC/DEF' -> 400, 'KSS/DEF' -> 500

Der Ausgang wie etwas so sein sollte:

enter image description here

Hinweis: der Algorithmus allgemein sein sollte und die Prüfung jede Spalte, nicht nur Nummer 3. Der Vollständigkeit halber sind alle Datentypen objects.

Bisher meine Linie von Codes sind diese aber ich denke, sie unvollständig sind ...

import pandas as pd 
import numpy as np 
df = pd.DataFrame([ 
     ['XYZ', 'BALSO', 'PISCO', 'KSS', 'Yes', 660, 'Cop'], 
     ['XYZ', 'TONTO', 'LOLLO', '195', 500, 'Yes', 'nan'], 
     ['XYZ', 'CALLO', 'WANDA', 'ABC/DEF', 'Yes', 500, 'nan'], 
     ['XYZ', 'AZUNGO', 'FINGI', 'KSS/DEF', 'Yes', 500, 'nan'] 
    ]) 
df = pd.read_csv('prova.csv', sep=',', skiprows=0, header=None, low_memory=False) 
df.str.replace('KSS|ABC|DEF','?') 
+0

Hier gehen wir wieder mit Unsinn downvoting .... –

+0

, weil es keinen Code zu schreiben ... Ich lade alles aus einer CSV-Datei! Die Frage ist für jeden klar und die Bilder helfen, es verständlich zu machen ... wenn du es nicht magst, ist es nicht mein Problem, aber ich sehe einige gute Leute da draußen, die mehr über das Problem besorgt sind als sich über zwei zu beschweren Bilder ... –

+0

Ich denke, was AYHAN sagt, ist, dass Sie keine Rohdaten zur Reproduktion Ihrer df, wenn Sie Text für die Daten, die wir aus der Zwischenablage laden könnte, und helfen Ihnen, sondern indem Sie Bilder, Sie hochgeladen haben sofort eine Barriere für die Gemeinschaft, um Ihnen zu helfen. Sie sollten unseren Standpunkt berücksichtigen, wenn Sie diese Frage gesehen hätten, wie würde man versuchen, sie zu reproduzieren? Wie auch immer, wenn Sie ein Dict oder eine Serie mit Ihren Lookup-Werten definieren, können Sie einfach 'df ['3']. Map (your_dict)' erstellen, aber Sie müssen Zeilen ausfiltern, in denen keine Übereinstimmung vorhanden ist. – EdChum

Antwort

3

Wenn Sie eine dict mit Suche und Wiederbeschaffungswerte erstellen, dann können Sie map auf dieser Spalte rufen Sie zusätzlich müssen na_action='ignore' zu map sonst passieren Sie eine KeyError für die fehlenden Werte zu erhalten, zusätzlich werden Sie feststellen, dass Sie die Werte fehlende Werte müssen float konvertiert werden, aber Sie können wieder werfen mit astype(int) später:

In [182]: 
d={'KSS':100, 'ABC' :200, 'DEF' : 300, 'ABC/DEF' : 400, 'KSS/DEF' : 500} 
df[3] = df[3].map(d, na_action='ignore') 
df 

Out[182]: 
    0  1  2  3 4 5 
0 XYZ BALSO PISCO 100.00 660 Cop 
1 XYZ TONTO LOLLO nan 500 nan 
2 XYZ CALLO WANDA 400.00 500 nan 
3 XYZ AZUNGO FINGI 500.00 500 nan 

hier werfen wir den Typ mit astype:

In [178]: 
df[3] = df[3].astype(int) 
df 

Out[178]: 
    0  1  2 3 4 5 
0 XYZ BALSO PISCO 100 660 Cop 
1 XYZ TONTO LOLLO 195 500 nan 
2 XYZ CALLO WANDA 400 500 nan 
3 XYZ AZUNGO FINGI 500 500 nan 
+0

Kann einfach 'verwenden .isin (d) 'anstatt seine' .keys() 'Methode dort aufzurufen ... –

+0

@JonClements eigentlich ist es nicht notwendig, da' map' einen 'na_action' Parameter nimmt, also wenn du' na_action = 'ignorierst' dann tust werde nicht borken und 'KeyError' emporheben – EdChum

+0

Haha ... wollte das nur erwähnen - schlag mich dazu :) –

Verwandte Themen