J'ai une base de données pandas où les cellules dans les colonnes ont plusieurs valeurs et sont séparées par ';'. J'essaie de diviser les valeurs multiples (dans une cellule) et créer de nouvelles lignes pour ceux qui se séparent. Quelque chose comme l'exemple ci-dessous:Python (Jupyter Notebook): Pandas copiant l'index de données causant la longueur de la valeur ne correspondant pas à la longueur de l'erreur d'index
> In: df
> Out:
| Year | State | Ingredient | Species |
| 1998 | CA | egg; pork | sp1;sp2 |
Le résultat que je suis en train de réaliser ressemble à ceci:
> In: df
> Out:
| Year | State | Ingredient | Species |
| 1998 | CA | egg | sp1 |
| 1998 | CA | egg | sp1 |
| 1998 | CA | pork | sp2 |
| 1998 | CA | pork | sp2 |
j'ai trouvé une méthode pour diviser la trame de données comme celui-ci, mais il fonctionne qu'une seule fois. Le code j'est présenté ci-dessous:
sp = df['Species'].str.split(';', expand=True).stack().reset_index(level=1, drop=True)
i = sp.index.get_level_values(0)
df1 = df.loc[i].copy()
df1['Species] = sp.values
Lorsque j'exécute ceci sur la colonne « espèces » d'abord, en utilisant la trame de données d'origine (df), cela fonctionne.
Cependant, lorsque j'exécute à nouveau ce code sur df1, en essayant de séparer tous les 'Ingrédients', cela me donne une erreur en disant que longueur ne correspond pas à la longueur de l'index. Comme indiqué ci-dessous:
fd = df1['Ingredient'].str.split(';', expand=True).stack().reset_index(level=1, drop=True)
j = fd.index.get_level_values(0)
df2 = df1.loc[j].copy()
df2['Ingredient'] = fd.values
Je l'ai fait beaucoup d'essais pour trouver pourquoi il renvoie ce message d'erreur pour moi, et j'ai réalisé que quand j'exécute cette appelé à nouveau sur DF1 pour créer DF2, il double le nombre de lignes/index lorsque j'exécute df2 = df1.loc [j] .copy(). Par conséquent, en me donnant plus de lignes que j'ai besoin. Cependant, si je substitue 'df1' avec 'df' (l'image originale) alors cette erreur n'apparaît pas et cela fonctionne.
Existe-t-il une solution pour résoudre ce problème? Ou y a-t-il un autre moyen de le diviser?
Merci.
ps. C'est ma première fois sur Stack Overflow, et je suis aussi nouveau sur Python. Désolé si le formatage est mauvais.
Merci de votre réponse! J'ai essayé votre code, et ça n'a pas très bien marché. Je pense que votre méthode a fonctionné pour vous parce que l'ensemble de données était petit. J'ai un ensemble de données volumineux et complexe, c'est pourquoi cela n'a pas fonctionné pour moi. Merci pour le conseil 'Edit', qui m'a vraiment aidé dans ma réflexion, et j'ai beaucoup appris de votre méthode. Si je trouve la solution, je vous le ferai savoir! – Dahlia
Est-ce que le correctif de votre code d'origine fonctionne? Je comprends plus tôt que c'était une question de fonctionnalité incorrecte, est-ce que le problème est maintenant au sujet de la performance? –
Super, bonne chance! –