I panda ottengono la sequenza di stringhe date 1 e 0

Oct 10 2020

Dato quanto segue:

import pandas as pd
df = pd.DataFrame({'a':['K','1','1,2,3']})
df
       a
0      K
1      1
2  1,2,3

Vorrei convertire i valori nella colonna a in una sequenza corrispondente di 1 e 0 data questa mappa:

K 1 2 3 4 5
1 1 1 1 1 1

Se è presente un valore, viene posto un 1 al posto di uno 0. Se il valore non è presente, il posto è tenuto da uno 0. Se non è presente alcun valore, la sequenza sarebbe una stringa di 6 0s.

Quindi "K" sarebbe: 100000

E "1,2,3" sarebbe: 011100

Risultato desiderato:

       a       b
0      K  100000
1      1  010000
2  1,2,3  011100

Ho provato pd.get_dummies(df['a']), ma funziona solo dove c'è solo 1 carattere nella cella.

Grazie in anticipo!

Risposte

1 AndrejKesely Oct 10 2020 at 03:55

Spero di aver capito bene la tua domanda, ma puoi usare .apply()con la mappa personalizzata:

m = {'K': 1 << 0,
     '1': 1 << 1,
     '2': 1 << 2, 
     '3': 1 << 3,
     '4': 1 << 4,
     '5': 1 << 5}
    
df['b'] = df.a.apply(
        lambda x: '{:06b}'.format(sum(m[v] for v in x.split(',')))[::-1]
    )
print(df)

Stampe:

       a       b
0      K  100000
1      1  010000
2  1,2,3  011100
1 BENY Oct 10 2020 at 03:57

Proviamo get_dummiesallorareindex

s = df.a.str.get_dummies(',').reindex(columns=['K','1','2','3','4','5'],fill_value=0).astype(str).agg(''.join,1)
0    100000
1    010000
2    011100
dtype: object
df['b'] = s