パンダデータフレームのデータの最後の行を削除する方法


103

これは簡単なはずですが、いくつかのアイデアを試しましたが、どれもうまくいきませんでした。

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

負のインデックスを使用してみましたが、それもエラーにつながります。私はまだ基​​本的なことを誤解しているに違いありません。


27
DF = DF[:-1]
U2EF1 2014年

@ U2EF1これはデータセット全体をコピーしますか?巨大なデータを処理する場合、これが問題になることがあります。
ManuelSchneid3r

回答:


163

最後のn行を削除するには:

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

同じように、最初のn行をドロップできます。

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

最後の列を削除するには、df.drop(df.columns [-1]、axis = 1、inplace = True)を使用できます。列の名前がわかっている場合は、df.drop(columns = ['col_name ']、inplace = True)-その場で実行したくない場合は、それを新しい変数に割り当て、その引数を削除します。
Shawn Schreier

78
DF[:-n]

ここで、nはドロップする最後の行数です。

最後の行を削除するには:

DF = DF[:-1]

58

Pythonのインデックス配置は0ベースであるため、実際にはにindex対応する場所に要素はありませんlen(DF)。あなたはそれが必要です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]

ただし、を記述するだけの方がはるかに簡単DF[:-1]です。


2
dfrm.indexを使用して削除する場合、最後の行のインデックスは一意である必要があります。そうでない場合、そのインデックスを持つすべての行が削除されます。
FranciscoD

drop(inplace = True)を使用すると既存のdfを変更する一方で、df [:-1]を使用するとデータのビューを取得し、後でSettingWithCopyWarningにつながる可能性があることを正しく理解していますか?
フィリップ

20

驚いた人は誰もこれを持ち出しませんでした:

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

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

1000行のDataFrameで速度テストを実行すると、スライスとhead/ tailが、使用するよりも〜6倍速いことがわかります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)

おそらく両方のアプローチの違いは、head()それtail()ビューを作成するのに対して、drop()実際にメモリ内の表現を変更することです(その場での変更、またはまったく新しいデータフレームの作成)。私はドキュメントでこれを調べませんでした、誰かがしてください。(それが違いである場合:perf diffの適切な説明、およびそれらの間で慎重に選択する必要がある)/
Jan-Philip Gehrcke博士

@ Dr.Jan-PhilipGehrcke Head headtailおよびdropすべてがビューを返しdropますが、元のデータフレームをインプレースで変更するオプションが提供されているのは事実です。
theGirrafish

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

統計の出力:

       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

ただ使う skipfooter=1

skipfooter:int、デフォルトは0

スキップするファイルの最下部の行数

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

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は新しい配列を返すので、それがogポストで窒息します。Dataframeに変換された不正な形式のcsvファイルが原因で、一部の列ヘッダーの名前を変更し、一部の行を削除する同様の要件があったため、この投稿を読んだ後、次のように使用しました:

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)

上記の2つのコメントアウトされた行を見るとわかるように、drop。()メソッドを試してみましたが、機能しましたが、[n:-n]を使用するほどクールで読みやすいものではありません。


0

マルチインデックス(たとえば、 "Stock"と "Date")があり、最後のStockの最後の行だけでなく、各Stockの最後の行を削除したい、より複雑なDataFrameの場合、ソリューションは次のようになります。

# 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)

groupby()マルチインデックスに追加のレベルを追加して、私たちはちょうど使用して最後にそれをドロップしますreset_index()。結果のdfは、操作前と同じタイプのマルチインデックスを保持します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.