当前位置: 首页 > 面试题库 >

如何分析此Pandas DataFrame中的所有重复项?

麹鸿煊
2023-03-14
问题内容

我希望能够计算Pandas DataFrame中数据的描述性统计信息,但我只关心重复的条目。例如,假设我通过以下方式创建了DataFrame:

import pandas as pd
data={'key1':[1,2,3,1,2,3,2,2],'key2':[2,2,1,2,2,4,2,2],'data':[5,6,2,6,1,6,2,8]}
frame=pd.DataFrame(data,columns=['key1','key2','data'])
print frame


     key1  key2  data
0     1     2     5
1     2     2     6
2     3     1     2
3     1     2     6
4     2     2     1
5     3     4     6
6     2     2     2
7     2     2     8

如您所见,行0、1、3、4、6和7都是重复的(使用’key1’和’key2’。但是,如果我像这样索引此DataFrame:

frame[frame.duplicated(['key1','key2'])]

我懂了

   key1  key2  data
3     1     2     6
4     2     2     1
6     2     2     2
7     2     2     8

(即第一行和第二行不会显示,因为重复的方法未将它们索引为True)。

那是我的第一个问题。我的第二个问题涉及如何从此信息中提取描述性统计信息。暂时忘记丢失的重复项,假设我要为重复项计算.min()和.max()(这样我就可以得到一个范围)。我可以在groupby对象上使用groupby和这些方法,如下所示:

a.groupby(['key1','key2']).min()

这使

           key1  key2  data
key1 key2                  
1    2        1     2     6
2    2        2     2     1

我想要的数据显然在这里,但是提取数据的最佳方法是什么?如何索引结果对象以获取所需的内容(key1,key2,数据信息)?


问题答案:

编辑 熊猫0.17 或更高版本:

由于自 Pandas 0.17 开始不赞成使用take_lastduplicated()方法的参数,而是使用新参数,因此请参考以下答案以获取正确的方法:keep

  • 使用调用该duplicated()方法keep=False,即frame.duplicated(['key1', 'key2'], keep=False)

因此,为了提取此特定问题所需的数据,需要满足以下条件:

In [81]: frame[frame.duplicated(['key1', 'key2'], keep=False)].groupby(('key1', 'key2')).min()
Out[81]: 
           data
key1 key2      
1    2        5
2    2        1

[2 rows x 1 columns]

有趣的是,如本期中所述, Pandas 0.17中的
此更改可能部分归因于该问题。

对于 Pandas 0.17 之前的版本:

我们可以使用方法take_last参数duplicated()

take_lastboolean,默认False

对于一组不同的重复行,将除最后一行以外的所有行标记为重复。除第一行外,所有其他都将被标记为默认值。

如果将take_last的值设置为True,则标记除最后重复的行以外的所有行。结合使用它的默认值False,它标记除第一重复行之外的所有行,使我们可以标记所有重复的行:

In [76]: frame.duplicated(['key1', 'key2'])
Out[76]: 
0    False
1    False
2    False
3     True
4     True
5    False
6     True
7     True
dtype: bool

In [77]: frame.duplicated(['key1', 'key2'], take_last=True)
Out[77]: 
0     True
1     True
2    False
3    False
4     True
5    False
6     True
7    False
dtype: bool

In [78]: frame.duplicated(['key1', 'key2'], take_last=True) | frame.duplicated(['key1', 'key2'])
Out[78]: 
0     True
1     True
2    False
3     True
4     True
5    False
6     True
7     True
dtype: bool

In [79]: frame[frame.duplicated(['key1', 'key2'], take_last=True) | frame.duplicated(['key1', 'key2'])]
Out[79]: 
   key1  key2  data
0     1     2     5
1     2     2     6
3     1     2     6
4     2     2     1
6     2     2     2
7     2     2     8

[6 rows x 3 columns]

现在我们只需要使用groupbymin方法,我相信输出是必需的格式:

In [81]: frame[frame.duplicated(['key1', 'key2'], take_last=True) | frame.duplicated(['key1', 'key2'])].groupby(('key1', 'key2')).min()
Out[81]: 
           data
key1 key2      
1    2        5
2    2        1

[2 rows x 1 columns]


 类似资料:
  • 问题内容: 这个问题已经在这里有了答案 : 在MySQL中删除重复的行 (25个答案) 3个月前关闭。 如何从MySQL表中删除所有重复数据? 例如,具有以下数据: 我会使用,如果它是一个查询。 我该怎么做才能只删除重复项并仅保留每个记录一个? 问题答案: 编辑者警告:此解决方案的计算效率低下,可能会降低大型表的连接。 注意:您 需要 首先在表的 测试副本 上执行此操作! 完成此操作后,我发现,除

  • 问题内容: 我将如何使用python检查列表并删除所有重复项?我不需要指定重复项是什么- 我希望代码找出是否存在重复项,如果有则将其删除,每个重复项仅保留一个实例。如果列表中有多个重复项,它也必须起作用。 例如,在下面的代码中,列表lseparatedOrbList有12个项目-一项被重复六次,一项被重复五次,并且只有一个实例。我希望它更改列表,因此只有三项-每一项,并且它们之前出现的顺序相同。我

  • 我是新的算法分析,所以如果有人能帮助我,我很感激。我有以下排序数组的算法: 我声称这个算法是线性算法(即O(n)),但我不知道如何证明这一点。

  • 本文向大家介绍在C ++程序中重复分发所有球,包括了在C ++程序中重复分发所有球的使用技巧和注意事项,需要的朋友参考一下 在本教程中,我们将学习如何在不伤害任何人的情况下为k个学生分配n个球。 这个想法很简单,我们有n个不同颜色的球需要分发给学生。我们不必给任何一个学生一个以上相同颜色的球。如果学生有可能获得多个同色的球,则不应进行分配。 让我们来看一个例子。 输入 输出 颜色不超过学生人数(k

  • 假设我有以下代码: 是否有一种方法可以得到下面的数组?

  • 我在用Java中的类解析日期格式时遇到了一些问题。 那么,对于这种日期格式类型()是否有任何日期格式化程序?