ファイルを開いて読み取り、ファイルの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をデータフレームとしてさらに使用するには、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))
リンクを確認しましたが、コードを変更する方法がわかりません。これを修正する方法についてのアイデアはありますか?
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)
_
あなたの.drop_duplicates()
が実際に警告を引き起こしていると思います。
代わりに、データフレームの新しいコピーを作成してください。
file2 = file1.drop_duplicates(["Var2", "Var3"]).copy()