2016-06-12 5 views
3

1つの列が特定の値以下のすべての行を削除する必要があります。私は以下のコマンドを使用しましたが、これはオブジェクトとして列を返します。私はint64としてそれを維持する必要があります。Pandas:値に基づくDrop()int64がオブジェクトを返します

df["customer_id"] = df.drop(df["customer_id"][df["customer_id"] < 9999999].index) 
df = df.dropna() 

私は後int64としてフィールド再キャストしようとしましたが、これは全く別の列からのデータと次のエラーが発生します。

invalid literal for long() with base 10: '2014/03/09 11:12:27' 
+0

df ["cutomer_id"] = df.drop(df ["cutomer_id"] <9999999> .index) – Merlin

+0

これは何も変更しません。ありがとうございました。 – user6453877

答えて

0

何フレーム全体をスライスして(そして必要に応じて再インデックスする)間違っていますか?

df = df[df["customer_id"] < 9999999] 
df.index = range(0,len(df)) 
1

は、私はあなたがboolean indexingreset_indexに必要だと思う:

import pandas as pd 

df = pd.DataFrame({'a': ['s', 'd', 'f', 'g'], 
       'customer_id':[99999990, 99999997, 1000, 8888]}) 
print (df) 
    a customer_id 
0 s  99999990 
1 d  99999997 
2 f   1000 
3 g   8888 

df1 = df[df["customer_id"] > 9999999].reset_index(drop=True) 
print (df1) 
    a customer_id 
0 s  99999990 
1 d  99999997 

ソリューションdropと、しかしslowierです:

df2 = (df.drop(df.loc[df["customer_id"] < 9999999, 'customer_id'].index)) 
print (df2) 
    a customer_id 
0 s  99999990 
1 d  99999997 

タイミング

In [12]: %timeit df[df["customer_id"] > 9999999].reset_index(drop=True) 
1000 loops, best of 3: 676 µs per loop 

In [13]: %timeit (df.drop(df.loc[df["customer_id"] < 9999999, 'customer_id'].index)) 
1000 loops, best of 3: 921 µs per loop 
+0

ありがとうございました! 1つのコマンドで複数の列でこれを実行できますか? – user6453877

+0

'9999999'の複数の列を比較する必要がありますか?はいの場合、すべての列の行に「9999999」が含まれている場合、または列の少なくとも1つに「9999999」が含まれている場合は、データを除外できますか? – jezrael

+0

など。 1列は9999999、別の列は999ですか?現在、変更をキャプチャするために一連のDFを定義する必要があります。私はこれを行うよりスマートな方法があると確信しています。 – user6453877

関連する問題