2016-11-08 19 views
1

Ich möchte Spalten von Datenrahmen in einer solchen Art und Weise verschmelzen:Zusammenführen von Spalten, die Listenwerte enthalten, wenn einige Spaltenlistenwerte leer sind?

list_A  list_B  
A, T, G  G, C   
      B, K   
C, L, AG L, AG, K  
F, K     

Die Ausgabe sollte:

list_A  list_B  list_A&B 
A, T, G  G, C   A, T, G, C 
      B, K   B, K 
C, L, AG L, AG, K  C, L, AG, K 
F, K      F, K 

ich getan habe:

df['list_A&B'] = df['list_A'].astype(list) + ', ' + df['list_B'].astype(list)

Und, Ich bekomme:

 list_A list_B   list_A&B 
0 A, T, G  G, C  A, T, G, G, C 
1  NaN  B, K     NaN 
2 C, L, AG L, AG, K C, L, AG, L, AG, K 
3  F, K  NaN     NaN 

Hier ist die Vereinigung der Liste ein Problem, wenn eine der Liste leer ist. Aber warum?

Ich versuchte dann als String Gewerkschaftlichkeit aber jetzt ist das hinzugefügt nan nicht gelöscht werden kann: df['list_A&B'] = df['list_A'].astype(str) + ', ' + df['list_B'].astype(str)

die gibt:

 list_A list_B   list_A&B 
0 A, T, G  G, C  A, T, G, G, C 
1  NaN  B, K   nan, B, K 
2 C, L, AG L, AG, K C, L, AG, L, AG, K 
3  F, K  NaN   F, K, nan 

Mit diesem Ausgang, Ich habe Schwierigkeiten beim 'nan' entfernen da sie als Strings gemeldet werden und dropna() und fillna() nicht damit arbeiten.

Irgendwelche Vorschläge! - K

+0

Was sind die tatsächlichen Werte in Spalten? Sind sie nur Saiten wie "A, T, G"? Was sind die leeren Werte? Sind sie leere Saiten? Können Sie ein Beispiel mit Beispieldaten bereitstellen (d. H. Den Code zum Generieren Ihres Beispieldatenrahmens)? – BrenBarn

+0

Die tatsächlichen Werte in den Spalten sind eine Liste von Buchstaben oder Zeichenfolgen.Die Spalten sind tabulatorgetrennt und alle leeren Werte in der Spalte sind leere Strings 'dh die leeren Zeilen-/Spaltenzellen sind nur Tab-Sprünge ohne Leerraum, um den leeren Wert/Liste darzustellen. Dieser Datenrahmen wurde erzeugt, indem zwei Datenrahmen mit Pandas verbunden wurden Zusammenführungsfunktion, wobei die leeren Werte (NaN) sind. Die Schlüssel zum Zusammenführen sind nicht ganz relevant (ich denke) und nicht gezeigt. – everestial007

+0

Ich sehe keine Listen in Ihren Daten. Wenn es Listen gäbe, würde ich erwarten, dass der Wert z.B. '["A", "T", "G"] 'ist. – BrenBarn

Antwort

1

Sieht so aus, als wären das einfach String-Werte, die von meiner Interpretation der Daten, die Sie bisher geliefert haben, ausgehen.

Schritte:

Verketten sie zeilenweise unter Verwendung von str.cat mit sep=','na_rep='' und die Versorgung der mit den anderen Zeichen-String streut NaN Werte annimmt, indem sie als eine leere char behandeln.

Entfernen Sie dann unerwünschte Leerzeichen zwischen ihnen und löschen Sie auch leere Zeichenfolgen mit filter(None,...), nachdem Sie die eindeutigen Elemente der Liste mit set genommen haben.

Schließlich schließe die resultierende Liste, um es zu einer Zeichenfolgendarstellung der Liste aber ohne die Klammern zu machen.

df['list_A&B'] = df['list_A'].str.cat(df['list_B'], ',','') \ 
        .apply(lambda x: ', '.join(list(filter(None, set(re.sub(r"\s+", "", x) \ 
        .split(',')))))) 

df     # df.fillna('') to get back your desired output 

enter image description here


Ab DF verwendet:

df = pd.DataFrame({'list_A': ['A, T, G', np.NaN, 'C, L, AG ', 'F, K'], 
        'list_B': ['G, C', 'B, K', 'L, AG, K', np.NaN]}) 
df 

enter image description here

Verwandte Themen