[英]Pandas drop duplicates does not behave as expected
我有一个 pandas 系列,其索引包含多个重复项,我使用drop_duplicates
使其索引可用于在其他系列/数据帧上进一步切片:
In[1]: test
Out[1]:
5575 21010210
5575 21010210
5577 21010210
5577 21010210
5577 21010210
5583 21010210
5583 21010210
5583 21010210
5586 21010210
5586 21010210
5586 21010210
8545 21010210
8545 21010210
8718 21000102
8718 21000102
8721 21000102
8721 21000102
Name: CC, dtype: object
当我应用test.drop_duplicates()
时,我希望所有现有索引都保留下来,尽管没有重复。 出于某种原因,pandas 没有将其中一些索引识别为重复项,而是简单地将它们从 dataframe 中清除:
In[2]: test.drop_duplicates()
Out[2]:
5575 21010210
8718 21000102
Name: CC, dtype: object
奇怪的是,如果我之前重置索引, drop_duplicates
方法将正常工作:
In[3]: test.reset_index().drop_duplicates()
Out[3]:
index CC
0 5575 21010210
2 5577 21010210
5 5583 21010210
8 5586 21010210
11 8545 21010210
13 8718 21000102
15 8721 21000102
为什么 pandas 会简单地从操作中删除一些索引? 如何在不重置索引的情况下有效删除这些重复项?
这是您的 pandas Series
object:
import pandas as pd
data = [
21010210, 21010210, 21010210, 21010210, 21010210, 21010210,
21010210, 21010210, 21010210, 21010210, 21010210, 21010210,
21010210, 21000102, 21000102, 21000102, 21000102
]
idx = [
5575, 5575, 5577, 5577, 5577, 5583, 5583, 5583,
5586, 5586, 5586, 8545, 8545, 8718, 8718, 8721, 8721
]
series = pd.Series(data, index=idx).rename("CC")
print(series)
>>>
5575 21010210
5575 21010210
5577 21010210
5577 21010210
5577 21010210
5583 21010210
5583 21010210
5583 21010210
5586 21010210
5586 21010210
5586 21010210
8545 21010210
8545 21010210
8718 21000102
8718 21000102
8721 21000102
8721 21000102
Name: CC, dtype: int64
现在,如果您运行drop_duplicates()
,这将忽略您的索引:
返回
DataFrame
并删除重复行,可选择仅考虑某些列。 索引,包括时间索引被忽略
print(series.drop_duplicates())
5575 21010210
8718 21000102
Name: CC, dtype: int64
最后, reset_index()
将返回一个dataframe
,其中前一个索引插入到 dataframe 列中,并且索引将重置:
print(series.reset_index())
index CC
0 5575 21010210
1 5575 21010210
2 5577 21010210
3 5577 21010210
4 5577 21010210
5 5583 21010210
6 5583 21010210
7 5583 21010210
8 5586 21010210
9 5586 21010210
10 5586 21010210
11 8545 21010210
12 8545 21010210
13 8718 21000102
14 8718 21000102
15 8721 21000102
16 8721 21000102
重置DataFrame的索引,改用默认的。
这意味着drop_duplicates()
现在将考虑这两列。
print(series.reset_index().drop_duplicates())
index CC
0 5575 21010210
2 5577 21010210
5 5583 21010210
8 5586 21010210
11 8545 21010210
13 8718 21000102
15 8721 21000102
最有效的方法是
print(series.loc[~series.index.duplicated()])
5575 21010210
5577 21010210
5583 21010210
5586 21010210
8545 21010210
8718 21000102
8721 21000102
Name: CC, dtype: int64
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.