Crea un array 2D con 2 colonne da un dataframe e loop per il valore

Nov 11 2020

Ho un enorme dataframe che assomiglia a questo:

    u_id  i_id  
0  55218    0      
1  55218    2       
2  55218    1       
3  55222    2 
4  55222    3      

Voglio creare un array con gli assi u_ide i_ided il valore è 1(se u_idha la i_id) e 0altrimenti.
Come quello:

    0    1    2    3
0   1    1    1    0
1   0    0    1    1

Ho creato l'array con:

df_neu = np.full(df[['u_id', 'i_id']].nunique(), 0)

ma ora non so come sovrascrivere 0.

Risposte

sharathnatraj Nov 11 2020 at 10:42

Per favore prova:

df = df.groupby('u_id')['i_id'].apply(list).reset_index()
def fill(x):
    for val in x.i_id:
        df_un[x.name,val] = 1
df.apply(lambda x: fill(x), axis=1)

print(df_un)

[[1 1 1 0]
 [0 0 1 1]]
Timus Nov 13 2020 at 21:21

Penso che questo

columns = sorted(set(df['i_id'].values))
df_neu = pd.DataFrame({key: [1 if c in group['i_id'].values else 0
                             for c in columns]
                       for key, group in df.groupby('u_id')},
                      index=columns).T

essenzialmente porta al risultato atteso:

       0  1  2  3
55218  1  1  1  0
55222  0  0  1  1

La mia ipotesi è che il tuo DataFrame originale sia denominato df.

Se vuoi sbarazzarti u_iddell'indice:

df_neu.reset_index(drop=True, inplace=True)
   0  1  2  3
0  1  1  1  0
1  0  0  1  1

O senza la trasposizione:

columns = sorted(set(df['i_id'].values))
df_neu = pd.DataFrame([[1 if c in group['i_id'].values else 0
                        for c in columns]
                       for _, group in df.groupby('u_id')],
                      columns=columns)