2017-08-17 3 views
1

私はPython-pandasを初めて使いました。現在、DataFrameのデータが連続しているかどうかをチェックするために使っています。例:範囲()関数のように、...パンダのDataFrameに欠けている行を伝える最も良い方法は何ですか?

thread sequence  start  end 
14  1  114 1647143 1672244 
15  1  115 1672244 1689707 
16  1  116 1689707 1713090 
17  1  118 1735352 1760283 
18  1  119 1760283 1788062 
19  1  120 1788062 1789885 
20  1  121 1789885 1790728 

すべての行は4列を所有しているが、一般的な順序で1のステップで増加しなければならないので、すべてが正しければ、それは116117118のようになります。しかしここでは、シーケンス== 117の行が抜けています。

私はそれを見つけようとしましたが、どうやってそれを行うのか分かりません。シーケンスを1つずつチェックするだけでは、効率が悪くなります。目的の出力は、欠けている行を伝えるか、欠落している行をNaNで埋めることです。

良いヒントやご提案があれば助かります。

答えて

2

RangeIndexを使用して高速化する方法:

In [415]: seq = pd.RangeIndex(df.sequence.min(), df.sequence.max()) 

In [416]: seq[~seq.isin(df.sequence)].values 
Out[416]: array([117]) 
+0

多くの感謝!ちょうど私が必要なもの。 – Castor

+0

@Castorデータフレームではなく値だけが必要な場合は、受け入れられた回答を使用しないでください。それは非常に遅いです。 –

+0

@COLDSPEEDはい、私はあなたが「最も速い方法」と言ったことに気付きました.DataFrameを取得してからNaNを見つけるのがはるかに遅いようですが、後でそれをテストするベンチマークを行います。先端ありがとう。 – Castor

1

希望の出力が表示されますが、下記をご確認ください。

test = df.set_index('sequence').reindex(range(df['sequence'].min(), df['sequence'].max())).reset_index() 
print(test) 

    sequence thread  start  end 
0  114  1.0 1647143.0 1672244.0 
1  115  1.0 1672244.0 1689707.0 
2  116  1.0 1689707.0 1713090.0 
3  117  NaN  NaN  NaN 
4  118  1.0 1735352.0 1760283.0 
5  119  1.0 1760283.0 1788062.0 
6  120  1.0 1788062.0 1789885.0 

print(test[test['thread'].isnull()]['sequence'].tolist()) 

[117] 
+0

ありがとう!パンダでインデックスをリセットする方法を理解するのに非常に役立つ – Castor

+0

申し訳ありませんが、私はそれが速かったので回答を選択し直しましたが、とにかくあなたのやり方ははるかに理解しやすくなりました。 – Castor

+0

@キャスター問題はありません! 'RangeIndex'を使うことは本当に良い答えです。 – su79eu7k

3

あなたはちょうどあなたがこのような何かをできる値欠落しているシーケンスを取得したい場合は :

>>> seq = pd.DataFrame(np.arange(df.iloc[0].sequence, df.iloc[-1].sequence)) 
>>> seq[~seq[0].isin(df.sequence)] 
    0 
3 117 
+0

はい、欠けている値が望ましい出力です、ありがとうございます! – Castor

関連する問題