16

ファイルを開いて読み取り、ファイルの 2 つの列に重複をドロップしてから、重複のないファイルをさらに使用して計算を実行したいと考えています。これを行うには、重複を削除した後、インデックス値も削除する pandas.drop_duplicates を使用しています。たとえば、1 行目を削除すると、file1 は file2 になります。

file1:
   Var1    Var2    Var3   Var4
0    52     2       3      89
1    65     2       3      43
2    15     1       3      78
3    33     2       4      67

file2:
   Var1    Var2    Var3   Var4
0    52     2       3      89
2    15     1       3      78
3    33     2       4      67

file2 をデータフレームとしてさらに使用するには、0、1、2、... に再インデックスする必要があります。

私が使用しているコードは次のとおりです。

file1 = pd.read_csv("filename.txt",sep='|', header=None, names=['Var1', 'Var2', 'Var3', 'Var4']) 
file2 = file1.drop_duplicates(["Var2", "Var3"])
# create another variable as a new index: ni
file2['ni']= range(0, len(file2)) # this is the line that generates the warning
file2 = file2.set_index('ni')

コードは実行されて良好な結果が得られますが、インデックスを再作成すると次の警告が表示されます。

SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
  file2['ni']= range(0, len(file2))

リンクを確認しましたが、コードを変更する方法がわかりません。これを修正する方法についてのアイデアはありますか?

4

2 に答える 2

27

Pandas には、このタスクを実行するための関数が組み込まれています。これにより、代替のより単純なアプローチによって、スローされたエラーを回避できます。

連番の新しい列を追加してから、その列にインデックスを設定するのではなく、次のようにします。

file2['ni']= range(0, len(file2)) # this is the line that generates the warning
file2 = file2.set_index('ni')

代わりに以下を使用できます。

file2 = file2.reset_index(drop=True)

のデフォルトの動作は.reset_index()、現在のインデックスを取得し、そのインデックスをデータフレームの最初の列として挿入してから、新しいインデックスを作成することです (ここでのロジックは、デフォルトの動作により、古いものと新しいものを非常に簡単に比較できるということです)インデックス、健全性チェックに非常に役立ちます)。drop=True古いインデックスを新しい列として保持する代わりに、それを削除して新しいインデックスに置き換えることを意味します。これは、あなたが望むように思えます。

まとめると、新しいコードは次のようになります

file1 = pd.read_csv("filename.txt",sep='|', header=None, names=['Var1', 'Var2', 'Var3', 'Var4']) 
file2 = file1.drop_duplicates(["Var2", "Var3"]).reset_index(drop=True)

こちらの質問もご覧ください

于 2015-08-27T18:49:08.337 に答える