2017-01-29 5 views
3

Ich habe einen Pandas-Datenrahmen. Eine der Spalten hat eine verschachtelte Liste. Ich möchte neue Spalten aus der verschachtelten ListeErstellen Sie neue Spalten in Pandas aus verschachtelten Python-Listen

Beispiel erstellen:

L = [[1,2,4], 
    [5,6,7,8], 
    [9,3,5]] 

Ich möchte alle Elemente in den verschachtelten Listen als Spalten. Der Wert sollte eins sein, wenn die Liste das Element enthält, und Null, wenn dies nicht der Fall ist.

1 2 4 5 6 7 8 9 3 
1 1 1 0 0 0 0 0 0 
0 0 0 1 1 1 1 0 0 
0 0 0 1 0 0 0 1 1 

Antwort

2

können Sie versuchen, die folgenden:

df = pd.DataFrame({"A": L}) 

df 
#   A 
#0 [1, 2, 4] 
#1 [5, 6, 7, 8] 
#2 [9, 3, 5] 

# for each cell, use `pd.Series(1, x)` to create a Series object with the elements in the 
# list as the index which will become the column headers in the result 
df.A.apply(lambda x: pd.Series(1, x)).fillna(0).astype(int) 

# 1 2 3 4 5 6 7 8 9 
#0 1 1 0 1 0 0 0 0 0 
#1 0 0 0 0 1 1 1 1 0 
#2 0 0 1 0 1 0 0 0 1 
+1

'pd.Series (1, x)' - das ist schlau! – MaxU

+0

Erstaunlich. Genau wie ich wollte! – Prasanth

+0

Diese Lösung beginnt nicht mit L in einer einzelnen Zelle von df. –

2

pandas

Sehr ähnlich @ Psidom Antwort. Allerdings benutze ich pd.value_counts und wird wiederholt

df

df = pd.DataFrame({'A': L})  

df.A.apply(pd.value_counts).fillna(0).astype(int) 

numpy

Beteiligtere, aber schnelle

lst = df.A.values.tolist() 
n = len(lst) 
lengths = [len(sub) for sub in lst] 
flat = np.concatenate(lst) 
u, inv = np.unique(flat, return_inverse=True) 
rng = np.arange(n) 
slc = np.hstack([ 
     rng.repeat(lengths)[:, None], 
     inv[:, None] 
    ]) 
data = np.zeros((n, u.shape[0]), dtype=np.uint8) 
data[slc[:, 0], slc[:, 1]] = 1 
pd.DataFrame(data, df.index, u) 

Ergebnisse

Verwenden @ Psidom der Griff
1 2 3 4 5 6 7 8 9 
0 1 1 0 1 0 0 0 0 0 
1 0 0 0 0 1 1 1 1 0 
2 0 0 1 0 1 0 0 0 1 
Verwandte Themen