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?
3 Réponses :
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
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
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