2016-06-18 14 views
1

Ich habe zwei Serien im Datenrahmen unten. Die erste ist eine Zeichenfolge, die in der zweiten erscheint, die eine URL-Zeichenfolge sein wird. Ich möchte die erste Reihe ändern, indem ich zusätzliche Zeichen verkette, und diese Änderung auf die zweite Zeichenfolge anwenden.Split und Join Series in Pandas

import pandas as pd 
#import urlparse 

d = {'OrigWord' : ['bunny', 'bear', 'bull'], 'WordinUrl' : ['http://www.animal.com/bunny/ear.html', 'http://www.animal.com/bear/ear.html', 'http://www.animal.com/bull/ear.html'] } 

df = pd.DataFrame(d) 

def trial(source_col, dest_col): 
    splitter = dest_col.str.split(str(source_col)) 
    print type(splitter) 
    print splitter 
    res = 'angry_' + str(source_col).join(splitter) 
    return res 

df['Final'] = df.applymap(trial(df.OrigWord, df.WordinUrl)) 

ich zu find the string from the source_col versuche, dann split auf dieser Zeichenfolge im dest_col, bewirkt dann diese Änderung auf der Saite in dest_col. Hier habe ich es als neue Serie Final genannt, aber ich würde lieber inplace. Ich denke, das Hauptproblem ist die splitter Variable, die nicht funktioniert und die Anwendung der Funktion.

Hier ist, wie Ergebnis aussehen soll:

 OrigWord         WordinUrl 
    angry_bunny http://www.animal.com/angry_bunny/ear.html 
    angry_bear http://www.animal.com/angry_bear/ear.html 
    angry_bull http://www.animal.com/angry_bull/ear.html 

Antwort

1

hier ist ein alternativer Ansatz:

df['WordinUrl'] = (df.apply(lambda x: x.WordinUrl.replace(x.OrigWord, 
                  'angry_' + x.OrigWord), axis=1)) 

In [25]: df 
Out[25]: 
    OrigWord         WordinUrl 
0 bunny http://www.animal.com/angry_bunny/ear.html 
1  bear http://www.animal.com/angry_bear/ear.html 
2  bull http://www.animal.com/angry_bull/ear.html 
+0

Dies ist die Antwort, die ich am besten finde, da es inplace plus keine Notwendigkeit ist, Funktion zu erstellen, verwenden Sie einfach Lambda. Vielen Dank – noblerthanoedipus

2

gelten soll nicht wirklich auf mehrere Spalten in der gleichen Zeile anzuwenden. Sie können Ihre Funktion so ändern, dass sie stattdessen eine Reihe aufnimmt und dann source_col, dest_col dem entsprechenden Wert in der Reihe zuweist. Eine Möglichkeit, es zu tun, ist wie folgt:

def trial(x): 
    source_col = x["OrigWord"] 
    dest_col = x['WordinUrl' ] 
    splitter = str(dest_col).split(str(source_col)) 
    res = splitter[0] + 'angry_' + source_col + splitter[1] 
    return res 


df['Final'] = df.apply(trial,axis = 1) 
1

Statt split zu verwenden, können Sie die replace Methode verwenden, um die angry_ auf die entsprechende Quelle vorangestellt wird:

def trial(row): 
    row.WordinUrl = row.WordinUrl.replace(row.OrigWord, "angry_" + row.OrigWord) 
    row.OrigWord = "angry_" + row.OrigWord 
    return row 

df.apply(trial, axis = 1) 

    OrigWord WordinUrl 
0 angry_bunny http://www.animal.com/angry_bunny/ear.html 
1 angry_bear http://www.animal.com/angry_bear/ear.html 
2 angry_bull http://www.animal.com/angry_bull/ear.html 
Verwandte Themen