これは簡単なはずですが、いくつかのアイデアを試しましたが、どれもうまくいきませんでした。
last_row = len(DF)
DF = DF.drop(DF.index[last_row]) #<-- fail!
負のインデックスを使用してみましたが、それもエラーにつながります。私はまだ基本的なことを誤解しているに違いありません。
これは簡単なはずですが、いくつかのアイデアを試しましたが、どれもうまくいきませんでした。
last_row = len(DF)
DF = DF.drop(DF.index[last_row]) #<-- fail!
負のインデックスを使用してみましたが、それもエラーにつながります。私はまだ基本的なことを誤解しているに違いありません。
回答:
最後の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
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]です。
驚いた人は誰もこれを持ち出しませんでした:
# 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の適切な説明、およびそれらの間で慎重に選択する必要がある)/
head、tailおよびdropすべてがビューを返しdropますが、元のデータフレームをインプレースで変更するオプションが提供されているのは事実です。
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
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]を使用するほどクールで読みやすいものではありません。
マルチインデックス(たとえば、 "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は、操作前と同じタイプのマルチインデックスを保持します。
DF = DF[:-1]?