繁体   English   中英

Pandas 删除重复项的行为不符合预期

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM