Comment supprimer la dernière ligne de données d'un dataframe pandas


104

Je pense que cela devrait être simple, mais j'ai essayé quelques idées et aucune n'a fonctionné:

last_row = len(DF)
DF = DF.drop(DF.index[last_row])  #<-- fail!

J'ai essayé d'utiliser des indices négatifs mais cela conduit également à des erreurs. Je dois encore me méprendre sur quelque chose de fondamental.


27
DF = DF[:-1]?
U2EF1

@ U2EF1 cela copie l'ensemble de données, n'est-ce pas? Lors de la gestion de données volumineuses, cela peut être un problème.
ManuelSchneid3r

Réponses:


163

Pour supprimer les n dernières lignes:

df.drop(df.tail(n).index,inplace=True) # drop last n rows

De la même manière, vous pouvez supprimer les n premières lignes:

df.drop(df.head(n).index,inplace=True) # drop first n rows

Pour supprimer la dernière colonne, vous pouvez utiliser df.drop (df.columns [-1], axis = 1, inplace = True) ou, si vous connaissez le nom de la colonne, vous pouvez utiliser df.drop (columns = ['col_name '], inplace = True) - si vous ne voulez pas qu'elle soit effectuée sur place, affectez-la à une nouvelle variable et supprimez cet argument.
Shawn Schreier le

78
DF[:-n]

où n est le dernier nombre de lignes à supprimer.

Pour supprimer la dernière ligne:

DF = DF[:-1]

58

Étant donné que le positionnement de l'index en Python est basé sur 0, il n'y aura pas d'élément indexà l'emplacement correspondant à len(DF). Vous en avez besoin pour être last_row = len(DF) - 1:

In [49]: dfrm
Out[49]: 
          A         B         C
0  0.120064  0.785538  0.465853
1  0.431655  0.436866  0.640136
2  0.445904  0.311565  0.934073
3  0.981609  0.695210  0.911697
4  0.008632  0.629269  0.226454
5  0.577577  0.467475  0.510031
6  0.580909  0.232846  0.271254
7  0.696596  0.362825  0.556433
8  0.738912  0.932779  0.029723
9  0.834706  0.002989  0.333436

[10 rows x 3 columns]

In [50]: dfrm.drop(dfrm.index[len(dfrm)-1])
Out[50]: 
          A         B         C
0  0.120064  0.785538  0.465853
1  0.431655  0.436866  0.640136
2  0.445904  0.311565  0.934073
3  0.981609  0.695210  0.911697
4  0.008632  0.629269  0.226454
5  0.577577  0.467475  0.510031
6  0.580909  0.232846  0.271254
7  0.696596  0.362825  0.556433
8  0.738912  0.932779  0.029723

[9 rows x 3 columns]

Cependant, il est beaucoup plus simple d'écrire simplement DF[:-1].


2
Notez que lors de la suppression à l'aide de dfrm.index, l'index de la dernière ligne doit être unique, sinon toutes les lignes avec cet index sont supprimées.
FranciscoD

Dois-je bien comprendre qu'en utilisant drop (inplace = True) vous modifiez le df existant, tout en utilisant df [: - 1] vous obtenez une vue des données, qui plus tard peut conduire à SettingWithCopyWarning?
Philipp

21

Personne n'a surpris celui-ci:

# To remove last n rows
df.head(-n)

# To remove first n rows
df.tail(-n)

L'exécution d'un test de vitesse sur un DataFrame de 1000 lignes montre que le découpage et head/ tailest ~ 6 fois plus rapide que d'utiliser drop:

>>> %timeit df[:-1]
125 µs ± 132 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

>>> %timeit df.head(-1)
129 µs ± 1.18 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

>>> %timeit df.drop(df.tail(1).index)
751 µs ± 20.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

Peut-être que la différence entre les deux approches est que head()et tail()créer une vue alors drop()qu'en réalité change la représentation en mémoire (soit une modification en place, soit crée une toute nouvelle trame de données). Je n'ai pas cherché cela dans les documents, s'il vous plaît, faites-le. (si c'est la différence: bonne explication pour perf diff, et il faut bien choisir entre eux) /
Dr.Jan-Philip Gehrcke

@ Dr.Jan-PhilipGehrcke Head head, tailet droptous renvoient une vue, bien qu'il soit vrai que cela dropvous donne la possibilité de modifier le dataframe d'origine en place.
theGirrafish

5
stats = pd.read_csv("C:\\py\\programs\\second pandas\\ex.csv")

La sortie des statistiques:

       A            B          C
0   0.120064    0.785538    0.465853
1   0.431655    0.436866    0.640136
2   0.445904    0.311565    0.934073
3   0.981609    0.695210    0.911697
4   0.008632    0.629269    0.226454
5   0.577577    0.467475    0.510031
6   0.580909    0.232846    0.271254
7   0.696596    0.362825    0.556433
8   0.738912    0.932779    0.029723
9   0.834706    0.002989    0.333436

juste utiliser skipfooter=1

skipfooter: int, par défaut 0

Nombre de lignes au bas du fichier à ignorer

stats_2 = pd.read_csv("C:\\py\\programs\\second pandas\\ex.csv", skipfooter=1, engine='python')

Sortie de stats_2

       A          B            C
0   0.120064    0.785538    0.465853
1   0.431655    0.436866    0.640136
2   0.445904    0.311565    0.934073
3   0.981609    0.695210    0.911697
4   0.008632    0.629269    0.226454
5   0.577577    0.467475    0.510031
6   0.580909    0.232846    0.271254
7   0.696596    0.362825    0.556433
8   0.738912    0.932779    0.029723

1

drop renvoie un nouveau tableau, c'est pourquoi il s'est étouffé dans le message og; J'avais une exigence similaire pour renommer certains en-têtes de colonne et supprimé certaines lignes en raison d'un fichier csv mal formé converti en Dataframe, donc après avoir lu cet article, j'ai utilisé:

newList = pd.DataFrame(newList)
newList.columns = ['Area', 'Price']
print(newList)
# newList = newList.drop(0)
# newList = newList.drop(len(newList))
newList = newList[1:-1]
print(newList)

et cela a très bien fonctionné, comme vous pouvez le voir avec les deux lignes commentées ci-dessus, j'ai essayé la méthode drop. () et cela fonctionne mais pas aussi bien et lisible qu'en utilisant [n: -n], j'espère que cela aide quelqu'un, merci.


0

Pour les DataFrames plus complexes qui ont un Multi-Index (disons "Stock" et "Date") et que l'on souhaite supprimer la dernière ligne de chaque Stock, pas seulement la dernière ligne du dernier Stock, la solution se lit comme suit:

# To remove last n rows
df = df.groupby(level='Stock').apply(lambda x: x.head(-1)).reset_index(0, drop=True)

# To remove first n rows
df = df.groupby(level='Stock').apply(lambda x: x.tail(-1)).reset_index(0, drop=True)

Comme l' groupby()ajout d'un niveau supplémentaire au Multi-Index, nous le déposons simplement à la fin en utilisant reset_index(). Le df résultant conserve le même type de multi-index qu'avant l'opération.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.