2017-10-22 4 views
1

Ich habe einen Datenrahmen, wo ich Kundennamen in 2 Spalten speichern. Ich muss die gemeinsamen Wörter aus beiden Spalten weglassen und das nicht übereinstimmende Wort zurückgeben.Nicht übereinstimmende Wörter aus einer Datenrahmenspalte zurückgeben

from io import StringIO 

import pandas as pd 

u_cols = ['page_id','web_id'] 
audit_trail = StringIO(''' 
shantanu prabhakar oak | santanu prabhakar oak 
amar atmaram patil | amar atmaram patel 
''') 

df11 = pd.read_csv(audit_trail, sep="|", names = u_cols ) 

Erwartete Ergebnisse:

santanu 
patel 

Was ich versucht habe:

set(df11['page_id']) - set(df11['web_id']) 

{'amar atmaram patil ', 'shantanu prabhakar oak '} 

Update:

Es wird groß sein, wenn ein Wörterbuch mit Korrekturen zurückgegeben wird:

{ 'shantanu': 'Shantanu', 'patil': 'patel'}

ich es vorher nicht fragen, weil ich dachte, es innerhalb Pandas nicht möglich war.

Antwort

2

Verwenden

In [5128]: df 
Out[5128]: 
        page_id     web_id 
0 shantanu prabhakar oak santanu prabhakar oak 
1  amar atmaram patil  amar atmaram patel 

In [5129]: df.apply(lambda x: set(x.web_id.split()) - set(x.page_id.split()), axis=1) 
Out[5129]: 
0 {santanu} 
1  {patel} 
dtype: object 

aktualisieren

In [5134]: df.apply(lambda x: {b:a for a, b in zip(x.web_id.split(), x.page_id.split()) 
           if a!=b}, axis=1) 
Out[5134]: 
0 {u'shantanu': u'santanu'} 
1   {u'patil': u'patel'} 
dtype: object 

oder Wohnung dict

In [5141]: vals = df.apply(lambda x: {b:a for a, b in zip(x.web_id.split(), 
                  x.page_id.split()) 
             if a!=b}, axis=1) 

In [5142]: {k:v for d in vals.values for k, v in d.items()} 
Out[5142]: {'patil': 'patel', 'shantanu': 'santanu'} 
+0

Dank für die schnelle Antwort. Ist es möglich, ein Diktat zurückzugeben? {'shantanu': 'santanu', 'patil': 'patel'} Mit anderen Worten, kann ich das erste, zweite und dritte Wort aus beiden Spalten vergleichen? Es wird immer 3 Wörter geben. – shantanuo

2

Mit pd.DataFrame.applymap und pd.DataFrame.diff

df11.applymap(lambda x: set(x.split())).diff(axis=1).iloc[:, -1] 

0 {santanu} 
1  {patel} 
Name: web_id, dtype: object 

Oder erstellen Sie ein Leerzeichen getrennt String

df11.applymap(lambda x: set(x.split())).diff(axis=1).iloc[:, -1].apply(' '.join) 

0 santanu 
1  patel 
Name: web_id, dtype: object 
Verwandte Themen