在pandas.drop_duplicates之后重新编制索引

时间:2015-03-05 18:26:31

标签: 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    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))

我确实检查了链接,但我无法弄清楚如何更改我的代码。关于如何解决这个问题的任何想法?

2 个答案:

答案 0 :(得分:10)

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()的默认行为是获取当前索引,将该索引作为数据帧的第一列插入,然后构建一个新索引(我假设这里的逻辑是默认行为使它非常很容易比较旧指数和新指数,对于完整性检查非常有用)。 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

答案 1 :(得分:0)

我认为您的Sub TransposeColToRow() ' TransposeColToRow Macro Range("B3:B14").Select Selection.Copy Range("B20").Select Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:=False, Transpose:=True End Sub 实际上是引起警告的原因。

请确保您为数据框制作了一个新副本:

.drop_duplicates()