2016-06-29 18 views
1

Ich versuche, Spalten mit String-Daten zusammenzufassen. Das Problem ist, dass ich das NaN ignorieren möchte, aber ich habe keine Lösung gefunden.Strings in Pandas verbinden

Die Datenrahmen wie folgt aussehen:

s=pd.DataFrame({'A':['(Text,','(Text1,'],'B':['(Text2,','(Text3,'],'C':['(Text4,','(Text5,']}) 


     A  B  C 
0 (Text, (Text2, (Text4, 
1 (Text1, (Text3, (Text5, 

Zuerst habe ich löschen Sie die Klammern und Kommata mit:

sA = s['A'].str.lstrip('(').str.rstrip(',') 
sB = s['B'].str.lstrip('(').str.rstrip(',') 
sC = s['C'].str.lstrip('(').str.rstrip(',') 

Und dann habe ich die Spalten zusammen.

sNew = sA + ' ' + sB + ' ' + sC 

print sNew 
0 Text Text2 Text4 
1 Text1 Text3 Text5 

1. Gibt es einen besseren Weg, um die Spalten zusammenfassen? Ich habe das Gefühl, dass dieser Weg nicht wirklich effizient ist. Ich versuchte die str.lstrip für alle Spalten, aber es funktioniert nicht.

2. Wenn ich ein NaN in einer Zelle habe, ist die Reihe NaN. Wie kann ich das NaN in diesem speziellen Fall ignorieren? z.B.

A  B  C 
0 (Text, (Text2, (Text4, 
1 (Text1, (Text3, NaN 

und mein Ergebnis wird, nachdem die Klammern löschen und zusammenzufassen ...

0 Text Text2 Text4 
1 NaN 

aber ich möchte folgendes Ergebnis ...

0 Text Text2 Text4 
1 Text1 Text3 

Es wird großartig sein, wenn Sie Habe ein paar Tipps für mich, um das Problem zu lösen!

Antwort

0

Ich glaube, Sie Kiwi Lösung verwenden können, wo hinzugefügt wird Entfernen (, von .strip('(,'):

import pandas as pd 
import numpy as np 

s=pd.DataFrame({'A':['(Text,','(Text1,'], 
       'B':[np.nan,'(Text3,'], 
       'C':['(Text4,',np.nan]}) 
print(s) 

     A  B  C 
0 (Text,  NaN (Text4, 
1 (Text1, (Text3,  NaN 

def concat(*args): 
    strs = [str(arg).strip('(,') for arg in args if not pd.isnull(arg)] 
    return ','.join(strs) if strs else np.nan 
np_concat = np.vectorize(concat) 

s['new'] = np_concat(s.A, s.B, s.C) 
print (s) 
     A  B  C   new 
0 (Text,  NaN (Text4, Text,Text4 
1 (Text1, (Text3,  NaN Text1,Text3 
+0

Das ist, was ich brauche. Vielen Dank! – EnergyNet

0

Sie können die Nullwerte Ihres Datenrahmens mit leeren Strings füllen, bevor Sie die neue Spalte berechnen. Verwenden Sie fillna wie folgt aus:

s.fillna('',inplace = True) 
Verwandte Themen