89 votes

Est-il possible d'insérer une ligne à une position arbitraire dans un cadre de données en utilisant pandas ?

J'ai un objet DataFrame similaire à celui-ci :

       onset    length
1      2.215    1.3
2     23.107    1.3
3     41.815    1.3
4     61.606    1.3
...

Ce que je voudrais faire, c'est insérer une ligne à une position spécifiée par une certaine valeur d'index et mettre à jour les index suivants en conséquence. Par exemple

       onset    length
1      2.215    1.3
2     23.107    1.3
3     30.000    1.3  # new row
4     41.815    1.3
5     61.606    1.3
...

Quelle serait la meilleure façon de procéder ?

85voto

bdiamante Points 6542

Vous pourriez trancher et utiliser concat pour obtenir ce que vous voulez.

line = DataFrame({"onset": 30.0, "length": 1.3}, index=[3])
df2 = concat([df.iloc[:2], line, df.iloc[2:]]).reset_index(drop=True)

Cela produira le cadre de données dans la sortie de votre exemple. Pour autant que je sache, concat est la meilleure méthode pour réaliser une opération de type insertion dans pandas, mais il est vrai que je ne suis en aucun cas un expert de pandas.

37voto

Reimar Points 509

Je trouve plus lisible de trier plutôt que de trancher et concaténer.

line = DataFrame({"onset": 30.0, "length": 1.3}, index=[2.5])
df = df.append(line, ignore_index=False)
df = df.sort_index().reset_index(drop=True)

26voto

SergioGM Points 130

Je pense que c'est encore plus facile sans concat ni append :

df.loc[2.5] = 30.0, 1.3
df = df.sort_index().reset_index(drop=True)

(En supposant que l'indice est tel que prévu, en partant de 1)

2voto

anurag pandey Points 73
line = DataFrame({"onset": 30.0, "length": 1.3}, index=[3])
df2 = concat([df.iloc[:2], line, df.iloc[3:]]).reset_index(drop=True)

Cette solution remplace les valeurs de l'index. Je veux juste ajouter un index sans remplacer les valeurs de l'index.

0voto

Cristian Garcia Points 805

Si vous souhaitez conserver les index d'origine, cela pourrait être plus efficace :

df = pd.DataFrame(dict(x=[0, 1, 2, 3, 4]))
df_update = pd.DataFrame(dict(x=[10, 11, 12]), index=[3, 4, 5])

# concat df_update first
df = pd.concat([df_update, df], axis=0)

# drop duplicates, updates will be prioritized
df = df.iloc[df.index.drop_duplicates()]

# sort to regain order
df.sort_index(inplace=True)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X