2016-10-22 5 views
1

100000行を含むデータフレーム(ratings_base)があります。私はそれから1行をフィルタリングして、私はそれのための次のコードセグメントを使用しました。私Seriesオブジェクトを返しますPandasデータフレームでフィルタリングした後に行を削除します

((ratings_base.loc[ratings_base['user_id'] == 1]).sort_values(by='rating', ascending=0)).iloc[0]

user_id  1 
movie_id 170 
rating  5 
Name: 19996, dtype: int64 

元のデータフレームオブジェクトからこの行(シリーズオブジェクト)を削除するにはどうすればよいですか?私はデータフレームのドロップ関数を使用することができますが、私はそれのための行インデックスが必要です。選択した行の行インデックスを取得できれば(SeriesオブジェクトのName属性として表示されます)、ドロップできます。

答えて

1

df.loc[0]は、最初の行を選択します。 df.loc[1:]は、最初の行の後のすべてを選択します。あなたが代わりに

ratings_base = ((ratings_base.loc[ratings_base['user_id'] == 1]) 
       .sort_values(by='rating', ascending=0)) 
ratings_base = ratings_base.iloc[1:] 

を使用することができます

だから、あなたはdf.dropを使用することができます。

row = ((ratings_base.loc[ratings_base['user_id'] == 1]) 
     .sort_values(by='rating', ascending=0)).iloc[0] 
label = row.name 
ratings_base = ratings_base.drop(label) 

あなたがすることが起こるない行をドロップしたい場合、これは、より柔軟であり最初。

ratings_base.dropは、インデックスがlabelすべての行をドロップすることに注意してください。インデックスが一意でない場合、複数の行が削除される可能性があります。

+0

代替案を推奨し、それも私を働かせました。サイドの質問をする。私はそれを落とすために "inplace = True"プロパティを使用しなければなりませんでした。 len(rating_base)をチェックして、それが落ちているかどうかを確認しました。 "inplace = True"プロパティがなければ、長さは100000で、その小道具では99999でした。理由は何ですか? – Malintha

+1

'df.drop(...、inplace = True)'を呼び出すと、 'drop'は' df'を修正して 'None'を返します。 'df.drop(...)'を呼び出すと、 'df'は変更されず、' drop'は新しいDataFrameを返します。したがって、 'df'の値を変更するには、割り当てを使う必要があります:' df = df.drop(...) '。私は 'inplace'という名前が誤解を招くので、後者を好む(' inplace = True'を避けてください)。一時的な記憶を保存しないという意味で真のインプレース操作ではありません。 'inplace'を避ける他の理由については、http://stackoverflow.com/a/22533110/190597も参照してください。 – unutbu

関連する問題