2
votes

Comment remplir le cadre de données en utilisant la correspondance entre les colonnes et la liste de colonnes et la liste de valeurs à l'aide de pandas?

J'ai un bloc de données comme celui-ci:

col1    col2    col3    col4    col5    col6     col7
 1       1       NA      NA      NA      NA       NA
 2       NA      NA      NA      2       3        NA
 3       NA      NA      NA      NA      NA       NA
 4       NA       4       5       6      7        NA
 5       NA      NA       9      NA      NA       8

les valeurs de col2 à col7 sont maintenant vides, maintenant j'ai deux listes,

list1=[['col2'],['col5','col6'],[],['col3','col4','col5','col6'],['col7','col4']]
list2=[['1'],['2','3'],[],['4','5','6','7'],['8','9']]

Je veux remplir le bloc de données si les noms de colonnes correspondent à list avec les valeurs correspondantes avec list2

Le résultat df devrait ressembler à,

df
col1    col2    col3    col4    col5    col6     col7
 1
 2
 3
 4
 5

Comment le faire de la manière la plus efficace en utilisant pandas, python?


0 commentaires

3 Réponses :


2
votes

Utilisez la solution de boucle avec zip et énumérer pour le compteur:

df = df[['col1']].join(df1)
print (df)
   col1 col2 col3 col4 col5 col6 col7
0     1    1  NaN  NaN  NaN  NaN  NaN
1     2  NaN  NaN  NaN    2    3  NaN
2     3  NaN  NaN  NaN  NaN  NaN  NaN
3     4  NaN    4    5    6    7  NaN
4     5  NaN  NaN    9  NaN  NaN    8

Ou essayez de créer 3 colonnes DataFrame puis pivot:

a = [(i, a1, b1) for i, (a, b) in enumerate(zip(list1, list2)) for a1, b1 in zip(a, b)]

df1 = pd.DataFrame(a).pivot(0,1,2)
print (df1)
1 col2 col3 col4 col5 col6 col7
0                              
0    1  NaN  NaN  NaN  NaN  NaN
1  NaN  NaN  NaN    2    3  NaN
3  NaN    4    5    6    7  NaN
4  NaN  NaN    9  NaN  NaN    8


0 commentaires

1
votes

Avec une boucle simple:

In [54]: for i, col_names in enumerate(list1): 
    ...:     df.loc[i, col_names] = list2[i] 
    ...:         
    ...:                                                                                                             

In [55]: df                                                                                                          
Out[55]: 
   col1 col2 col3 col4 col5 col6 col7
0     1    1  NaN  NaN  NaN  NaN  NaN
1     2  NaN  NaN  NaN    2    3  NaN
2     3  NaN  NaN  NaN  NaN  NaN  NaN
3     4  NaN    4    5    6    7  NaN
4     5  NaN  NaN    9  NaN  NaN    8


0 commentaires

2
votes

Ce que je vais faire

df.update(pd.concat([pd.DataFrame(data=[z],columns=y,index=[x]) for x , (y, z) in enumerate(zip(list1,list2))]))
df
   col1 col2 col3 col4 col5 col6 col7
0     1    1  NaN  NaN  NaN  NaN  NaN
1     2  NaN  NaN  NaN    2    3  NaN
2     3  NaN  NaN  NaN  NaN  NaN  NaN
3     4  NaN    4    5    6    7  NaN
4     5  NaN  NaN    9  NaN  NaN    8


0 commentaires