我想打开一个文件,读取它,在文件的两列中删除重复项,然后进一步使用没有重复项的文件进行一些计算。为此,我使用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作为 Dataframe ,我需要将其重新索引为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条答案
按热度按时间fdbelqdn1#
Pandas has a built in function to accomplish this task,它允许您通过一种替代的、更简单的方法来避免抛出的错误
而不是添加一个新的序列号列,然后设置该列的索引,就像您对:
您可以改为用途:
.reset_index()
的默认行为是获取当前索引,将该索引作为 Dataframe 的第一列插入,然后构建一个新索引(我假设这里的逻辑是,默认行为使得比较旧索引与新索引非常容易,这对于健全性检查非常有用).drop=True
意味着不将旧索引保留为新列,只要去掉它,用新的索引替换它,这似乎是你想要的。合在一起,您的新代码可能看起来像这样
See this question as well
p1tboqfb2#
我认为你的
.drop_duplicates()
实际上导致了警告。相反,请确保您创建了dataframe的新副本:
xtfmy6hx3#
您可以简单地将pandas.DataFrame.drop_duplicates()的
ignore_index
参数设置为True
,以重新索引生成的DataFrame。默认情况下,其值为False
。那么,你的代码
将更新为
yb3bgrhw4#
pandas〉= 2.0:
drop_duplicates
现在支持ignore_index=True
pandas〉= 2.0
这允许您跳过后续的
reset_index
调用。在GH48304中实现
对于旧版pandas(〈2.0)