调用pandas drop_duplicates后重置索引

klh5stk1  于 2023-04-18  发布在  其他
关注(0)|答案(4)|浏览(171)

我想打开一个文件,读取它,在文件的两列中删除重复项,然后进一步使用没有重复项的文件进行一些计算。为此,我使用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))

我确实检查了链接,但我不知道如何更改我的代码。有什么想法如何解决这个问题吗?

fdbelqdn

fdbelqdn1#

Pandas has a built in function to accomplish this task,它允许您通过一种替代的、更简单的方法来避免抛出的错误
而不是添加一个新的序列号列,然后设置该列的索引,就像您对:

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()的默认行为是获取当前索引,将该索引作为 Dataframe 的第一列插入,然后构建一个新索引(我假设这里的逻辑是,默认行为使得比较旧索引与新索引非常容易,这对于健全性检查非常有用). 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)

See this question as well

p1tboqfb

p1tboqfb2#

我认为你的.drop_duplicates()实际上导致了警告。
相反,请确保您创建了dataframe的新副本:

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

xtfmy6hx3#

您可以简单地将pandas.DataFrame.drop_duplicates()的ignore_index参数设置为True,以重新索引生成的DataFrame。默认情况下,其值为False
那么,你的代码

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')

将更新为

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

yb3bgrhw4#

pandas〉= 2.0:drop_duplicates现在支持ignore_index=True

pandas〉= 2.0

df.drop_duplicates(["Var2", "Var3"], ignore_index=True)

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

这允许您跳过后续的reset_index调用。
GH48304中实现
对于旧版pandas(〈2.0)

df.drop_duplicates(["Var2", "Var3"]).reset_index(drop=True)

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

相关问题