Python 在pandas.drop\u副本之后重新编制索引

Python 在pandas.drop\u副本之后重新编制索引,python,reindex,Python,Reindex,我想打开一个文件,读取它,在文件的两列中放置重复项,然后进一步使用没有重复项的文件进行一些计算。为此,我使用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

我想打开一个文件,读取它,在文件的两列中放置重复项,然后进一步使用没有重复项的文件进行一些计算。为此,我使用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))
我确实检查了链接,但我不知道如何更改代码。关于如何解决这个问题有什么想法吗?

,这将允许您通过另一种更简单的方法来避免抛出的错误

与添加新的序列号列,然后将索引设置为该列不同,您可以使用:

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\u duplicates()
实际上是引起警告的原因

相反,请确保创建数据帧的新副本:

file2 = file1.drop_duplicates(["Var2", "Var3"]).copy()

不必在下一步中重置索引(
.reset\u index(drop=True)
),您可以将另一个属性添加到
drop\u duplicates()
ignore\u index=True