【问题标题】:How to find duplicates in pandas dataframe如何在熊猫数据框中查找重复项
【发布时间】:2018-11-22 08:16:05
【问题描述】:

编辑。

假设我在 pandas 中有以下系列:

>>>p
0     0.0
1     0.0
2     0.0
3     0.3
4     0.3
5     0.3
6     0.3
7     0.3
8     1.0
9     1.0
10    1.0
11    0.2
12    0.2
13    0.3
14    0.3
15    0.3

我需要识别每个连续重复的序列 - 它的第一个和最后一个索引。使用上面的示例,我需要独立于 0.3 的最后一个序列(从索引 13 到 15)识别第一个 0.3 序列(从索引 3 到 7)。

使用 Series.duplicated 是不够的,因为:

*使用 keep='first' 将所有重复项的第一个实例标记为 False,但会将索引 13 保留为 True,因为它不是 0.3 的第一次出现。

*keep='last' 也是如此

*keep=False 只是将所有条目标记为 True。

谢谢!

【问题讨论】:

  • 似乎是一个简单的问题,但如果没有数据就很难可视化。显示一些示例数据
  • 列中的计数值已经在本网站和其他地方的很多地方进行了介绍。你在哪里坚持这些解决方案?即使没有这些,用于识别连续值的基本循环代码在哪里(另一个覆盖良好的应用程序)?
  • 请阅读how to make good reproducible pandas examples并相应地编辑您的帖子。
  • 谢谢你并道歉。我试图快速回答这个问题,但没有意识到它是如此不清楚。我编辑并添加了一个简单的示例来演示该问题。提前谢谢!

标签: python pandas dataframe duplicates


【解决方案1】:

我认为需要将shifted 值与necumsum 和最后一个drop_duplicates 进行比较的技巧:

s = df['a'].ne(df['a'].shift()).cumsum()
a = s.drop_duplicates().index
b = s.drop_duplicates(keep='last').index

df = pd.DataFrame({'first':a, 'last':b})
print (df)
   first  last
0      0     2
1      3     7
2      8    10
3     11    12
4     13    15

如果还想将值复制到新列,请使用duplicated 更改解决方案:

s = df['a'].ne(df['a'].shift()).cumsum()
a = df.loc[~s.duplicated(), 'a']
b = s.drop_duplicates(keep='last')

df = pd.DataFrame({'first':a.index, 'last':b.index, 'val':a})
print (df)
    first  last  val
0       0     2  0.0
3       3     7  0.3
8       8    10  1.0
11     11    12  0.2
13     13    15  0.3

如果需要新栏目:

df['count'] = df['a'].ne(df['a'].shift()).cumsum()
print (df)
      a  count
0   0.0      1
1   0.0      1
2   0.0      1
3   0.3      2
4   0.3      2
5   0.3      2
6   0.3      2
7   0.3      2
8   1.0      3
9   1.0      3
10  1.0      3
11  0.2      4
12  0.2      4
13  0.3      5
14  0.3      5
15  0.3      5

【讨论】:

  • 这是完美的。正是我需要的。非常感谢您的帮助!!
猜你喜欢
  • 2021-04-26
  • 2018-04-21
  • 2021-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-26
  • 2015-12-08
相关资源
最近更新 更多