2016-05-23 17 views
1

Hier sind Beispiel-Jason-Daten.Wie finde ich doppelte Wörter in einer Zeile mit Pandas?

id opened_date  title  exposure state 

1 06/11/2014 9:28 AM Device rebooted and crashed with error 0x024 critical open 

2 06/11/2014 7:12 AM Not able to connect to WiFi     High  open 

3 07/23/2014 2:11 PM Sensor failed to recognize movement   Low open 

4 07/07/2014 5:20 PM When sensor activated, device rebooted with error 0x024 critical closed 

Ich möchte einen Code mit Eingabe als String schreiben und Ausgabe soll auf ID zeigen.

Zum Beispiel:

Input String = Sensor : Output = ID 3 and 4 has 'Sensor' word in it 
Input String = 0x024 : Output = ID 1 and 4 has '0x024' in it. 

ich dieses erraten wird eine Art von groupby erfordern, aber es funktioniert auf vollständigen Datensatz, anstatt ein String. Ist das möglich mit pandas oder gibt es eine andere bessere Lösung, um dies zu analysieren?

+0

können Sie tue 'df.loc [df ['title']. str.contains ('Sensor'), 'id]' also gib deine Eingabe-Zeichenfolge als Argument für 'str.contains' weiter – EdChum

Antwort

3

Sie können loc für die Auswahl nach Bedingung str.contains mit Parameter case=False verwendet verwenden. Zuletzt, wenn Sie list Verwendung tolist benötigen:

li = ['Sensor','0x024'] 

for i in li: 
    print (df.loc[df['title'].str.contains(i, case=False),'id'].tolist()) 
    [3, 4] 
    [1, 4] 

Zum Speichern Sie verwenden können dict Verständnis:

dfs = { i: df.loc[df['title'].str.contains(i, case=False),'id'].tolist() for i in li } 

print (dfs['Sensor']) 
[3, 4] 
print (dfs['0x024']) 
[1, 4] 

Wenn Sie function benötigen, versuchen get_id:

def get_id(id): 
    ids = df.loc[df['title'].str.contains(id, case=False),'id'].tolist() 
    return "Input String = %s : Output = ID " % id + 
      " and ".join(str(x) for x in ids) + 
      " has '%s' in it." % id 

print (get_id('Sensor')) 
Input String = Sensor : Output = ID 3 and 4 has 'Sensor' in it. 

print (get_id('0x024')) 
Input String = 0x024 : Output = ID 1 and 4 has '0x024' in it. 

EDIT von Kommentar:

Nun ist es komplizierter, weil die Verwendung logische and:

def get_multiple_id(ids): 
    #split ids and crete list of boolean series containing each id 
    ids1 = [df['title'].str.contains(x, case=False) for x in ids.split()] 
    #http://stackoverflow.com/a/20528566/2901002 
    cond = np.logical_and.reduce(ids1) 

    ids = df.loc[cond,'id'].tolist() 
    return "Input String = '%s' : Output = ID " % id + 
      ' and '.join(str(x) for x in ids) + 
      " has '%s' in it." % id 

print (get_multiple_id('0x024 Sensor')) 
Input String = '0x024 Sensor' : Output = ID 4 has '0x024 Sensor' in it. 

Wenn Gebrauch logische or, ist es einfacher ist, weil or in re| ist, so dass Sie 0x024|Sensor verwenden können:

def get_multiple_id(id): 
    ids = df.loc[df['title'].str.contains(id.replace(' ','|'), case=False),'id'].tolist() 
    return "Input String = '%s' : Output = ID " % id + 
      ' and '.join(str(x) for x in ids) + 
      " has '%s' in it." % id 

print (get_multiple_id('0x024 Sensor')) 
Input String = '0x024 Sensor' : Output = ID 1 and 3 and 4 has '0x024 Sensor' in it. 
+0

Ich hätte meine Frage umrahmen sollen füge einen weiteren Fall hinzu. Entschuldigung für die Frage in einem Kommentar. So integrieren Sie diesen Anwendungsfall: Input String = '0x024, sensor': Output = ID 4 enthält '0x024' und 'sensor'. ? –

+0

Bitte überprüfen Sie bearbeiten. – jezrael

+0

Danke @jezrael. Das hat mir sehr geholfen. Das ist mein Tag2 in Pandas und ich liebe es schon. Hier ist der nächste Thread, den ich gepostet habe: [link] (http://stackoverflow.com/questions/37411300/pandas-split-text-in-column-and-search-in-rows) –

Verwandte Themen