2017-08-15 6 views
1

私は2つのパンダのデータフレームdf1 & df2の両方から削除したい行インデックスのリストto_deleteを持っています。どちらも500行あります。 to_deleteには50個のエントリがあります。Pandas Dataframeから複数の行を削除しようとしましたが、それ以上の行が削除されています

df1.drop(df1.index[to_delete], inplace=True) 
df2.drop(df2.index[to_delete], inplace=True) 

をしかし、これはDF1とDF2は250行ごとを持つことになる: 私はこれを実行します。それは私がそれをしたい50の特定の行ではなく、それぞれから250行を削除します...

to_deleteは降順で並べられています。

フル方法:私が間違ってやっているのよう

def method(results): 
    #results is a 500 x 1 matrix of 1's and -1s 
    global df1, df2 
    deletions = [] 
    for i in xrange(len(results)-1, -1, -1): 
     if results[i] == -1: 
     deletions.append(i) 
    df1.drop(df1.index[deletions], inplace=True) 
    df2.drop(df2.index[deletions], inplace=True) 

任意の提案ですか?

(私も.iloc代わりの.indexを使用して、代わりに最初のリストに追加するのif statementに削除しようとしました。

+0

DFのインデックスが一意でない場合(例えば 'データ= pd.DataFrame(np.arange(12).reshape(4,3)、カラム= [ 'A'、 'B'、 'C​​' ]、index = [1,1,2,3]) ')、' data.drop(data.index [1,2]、inplace = True) 'は3行を削除します。ドロップするインデックスは2つだけです。 –

答えて

1

あなたのインデックス値は一意ではありません、あなたはdropを使用するとき、それはそれらをすべての行を削除していますインデックス値は、to_deleteを長さ50からなっているかもしれないが、それらの特定の指標値を有していた250行があった。

例を考え

df = pd.DataFrame(dict(A=range(10)), [0, 1, 2, 3, 4] * 2) 

df 

    A 
0 0 
1 1 
2 2 
3 3 
4 4 
0 5 
1 6 
2 7 
3 8 
4 9 

たとえば、1行目、3行目、4行目を削除したいとします。

あなたの方法

これは目よりも自明です to_del
の補数を見つける問題


オプション1つの
使用np.in1dある

df.drop(df.index[to_del]) 

    A 
1 1 
4 4 
1 6 
4 9 

を使用して

to_del = [0, 2, 3] 

その他。私は0からnまでの配列を探していて、それがto_delであるかどうかを調べています。結果は、dfと同じ長さのブール値配列になります。私は~を使用して否定を取得し、それを使ってデータフレームをスライスします。

df[~np.in1d(np.arange(len(df)), to_del)] 

    A 
1 1 
4 4 
0 5 
1 6 
2 7 
3 8 
4 9 

オプションこれはto_delで定義された位置をカウントすることにより、オプション1と同じことを実現to_del
の補数を見つける2

使用np.bincount。私は、to_del0で定義されている各位置にと01の配列で終わります。私は0を保持したいので、0と等しい場所を見つけることによってブール値の配列を作成します。私はこれを使ってデータフレームをスライスします。

df[np.bincount(to_del, minlength=len(df)) == 0] 

    A 
1 1 
4 4 
0 5 
1 6 
2 7 
3 8 
4 9 

これは、位置と私は削除するだけのものの完全な配列の違いを見つけるために、一連のロジックを使用して位置
を見つけるためのオプション3

使用np.setdiff1d。次にilocを使用して選択します。

df.iloc[np.setdiff1d(np.arange(len(df)), to_del)] 

    A 
1 1 
4 4 
0 5 
1 6 
2 7 
3 8 
4 9 
+0

ありがとうございます、あなたの提案は働いた!オプション2を使いましたが、実際に何をしているのか分かりません。説明していただけますか? また、好奇心の外に。 pd.read_csvを使用してデータフレームを取得しました。インデックスはどのようにユニークではありませんか?私はそれらを何にも設定しませんでした。私はインデックスが基本的に行番号であると仮定しました。 (申し訳ありません、私はPythonを初めて使っています(〜3週間)。 – MahDhan

+0

私はいくつかの解説を追加しました。希望が役立ちます。 – piRSquared

+0

@MahDhanはインデックスの一意性に関して。それがあなたの状況がどうなるか想像できる唯一の方法です。 csvを読むと、そのファイルの一部をインデックスとして使用できます。ユニークではないかもしれません。また、あなたは質問をするとき。問題の原因となっているものの例を挙げると、それが好きです。そうすれば、私たちはあいまいさを取り除き、関係するすべての人にあなたが必要とするものを簡単に得ることができます。 – piRSquared

関連する問題