如何使用 Python 中的 pandas 获取所有重复项目的列表?
- 2025-01-20 09:07:00
- admin 原创
- 146
问题描述:
我有一个项目列表,其中可能存在一些导出问题。我想获取重复项目的列表,以便可以手动比较它们。当我尝试使用 pandas duplicated 方法时,它只返回第一个重复项。有没有办法获取所有重复项而不仅仅是第一个重复项?
我的数据集的一小部分如下所示:
ID,ENROLLMENT_DATE,TRAINER_MANAGING,TRAINER_OPERATOR,FIRST_VISIT_DATE
1536D,12-Feb-12,"06DA1B3-Lebanon NH",,15-Feb-12
F15D,18-May-12,"06405B2-Lebanon NH",,25-Jul-12
8096,8-Aug-12,"0643D38-Hanover NH","0643D38-Hanover NH",25-Jun-12
A036,1-Apr-12,"06CB8CF-Hanover NH","06CB8CF-Hanover NH",9-Aug-12
8944,19-Feb-12,"06D26AD-Hanover NH",,4-Feb-12
1004E,8-Jun-12,"06388B2-Lebanon NH",,24-Dec-11
11795,3-Jul-12,"0649597-White River VT","0649597-White River VT",30-Mar-12
30D7,11-Nov-12,"06D95A3-Hanover NH","06D95A3-Hanover NH",30-Nov-11
3AE2,21-Feb-12,"06405B2-Lebanon NH",,26-Oct-12
B0FE,17-Feb-12,"06D1B9D-Hartland VT",,16-Feb-12
127A1,11-Dec-11,"064456E-Hanover NH","064456E-Hanover NH",11-Nov-12
161FF,20-Feb-12,"0643D38-Hanover NH","0643D38-Hanover NH",3-Jul-12
A036,30-Nov-11,"063B208-Randolph VT","063B208-Randolph VT",
475B,25-Sep-12,"06D26AD-Hanover NH",,5-Nov-12
151A3,7-Mar-12,"06388B2-Lebanon NH",,16-Nov-12
CA62,3-Jan-12,,,
D31B,18-Dec-11,"06405B2-Lebanon NH",,9-Jan-12
20F5,8-Jul-12,"0669C50-Randolph VT",,3-Feb-12
8096,19-Dec-11,"0649597-White River VT","0649597-White River VT",9-Apr-12
14E48,1-Aug-12,"06D3206-Hanover NH",,
177F8,20-Aug-12,"063B208-Randolph VT","063B208-Randolph VT",5-May-12
553E,11-Oct-12,"06D95A3-Hanover NH","06D95A3-Hanover NH",8-Mar-12
12D5F,18-Jul-12,"0649597-White River VT","0649597-White River VT",2-Nov-12
C6DC,13-Apr-12,"06388B2-Lebanon NH",,
11795,27-Feb-12,"0643D38-Hanover NH","0643D38-Hanover NH",19-Jun-12
17B43,11-Aug-12,,,22-Oct-12
A036,11-Aug-12,"06D3206-Hanover NH",,19-Jun-12
我的代码目前如下所示:
df_bigdata_duplicates = df_bigdata[df_bigdata.duplicated(cols='ID')]
有几个重复的项目。但是,当我使用上面的代码时,我只能得到第一个项目。在 API 参考中,我知道如何获取最后一个项目,但我希望获得所有项目,这样我就可以直观地检查它们,看看为什么会出现差异。因此,在这个例子中,我希望获取所有三个 A036 条目和两个 11795 条目以及任何其他重复的条目,而不仅仅是第一个。任何帮助都非常感谢。
解决方案 1:
方法#1:打印所有ID为重复ID之一的行:
>>> import pandas as pd
>>> df = pd.read_csv("dup.csv")
>>> ids = df["ID"]
>>> df[ids.isin(ids[ids.duplicated()])].sort_values("ID")
ID ENROLLMENT_DATE TRAINER_MANAGING TRAINER_OPERATOR FIRST_VISIT_DATE
24 11795 27-Feb-12 0643D38-Hanover NH 0643D38-Hanover NH 19-Jun-12
6 11795 3-Jul-12 0649597-White River VT 0649597-White River VT 30-Mar-12
18 8096 19-Dec-11 0649597-White River VT 0649597-White River VT 9-Apr-12
2 8096 8-Aug-12 0643D38-Hanover NH 0643D38-Hanover NH 25-Jun-12
12 A036 30-Nov-11 063B208-Randolph VT 063B208-Randolph VT NaN
3 A036 1-Apr-12 06CB8CF-Hanover NH 06CB8CF-Hanover NH 9-Aug-12
26 A036 11-Aug-12 06D3206-Hanover NH NaN 19-Jun-12
但我想不出一个好办法来避免重复ids
这么多次。我更喜欢方法 2:groupby
在 ID 上。
>>> pd.concat(g for _, g in df.groupby("ID") if len(g) > 1)
ID ENROLLMENT_DATE TRAINER_MANAGING TRAINER_OPERATOR FIRST_VISIT_DATE
6 11795 3-Jul-12 0649597-White River VT 0649597-White River VT 30-Mar-12
24 11795 27-Feb-12 0643D38-Hanover NH 0643D38-Hanover NH 19-Jun-12
2 8096 8-Aug-12 0643D38-Hanover NH 0643D38-Hanover NH 25-Jun-12
18 8096 19-Dec-11 0649597-White River VT 0649597-White River VT 9-Apr-12
3 A036 1-Apr-12 06CB8CF-Hanover NH 06CB8CF-Hanover NH 9-Aug-12
12 A036 30-Nov-11 063B208-Randolph VT 063B208-Randolph VT NaN
26 A036 11-Aug-12 06D3206-Hanover NH NaN 19-Jun-12
解决方案 2:
使用 Pandas 0.17 版本,您可以在duplicated函数中设置“keep = False”来获取所有重复项目。
In [1]: import pandas as pd
In [2]: df = pd.DataFrame(['a','b','c','d','a','b'])
In [3]: df
Out[3]:
0
0 a
1 b
2 c
3 d
4 a
5 b
In [4]: df[df.duplicated(keep=False)]
Out[4]:
0
0 a
1 b
4 a
5 b
解决方案 3:
df[df.duplicated(['ID'], keep=False)]
它会将所有重复的行返回给您。
根据文献:
keep
:{'first','last',False},默认'first'
'first' :除第一次出现外,将重复项标记为 True。
'last' :除最后一次出现的情况外,将重复项标记为 True。
False :将所有重复项标记为 True。
解决方案 4:
由于我无法发表评论,因此作为单独的答案发布
要根据多列查找重复项,请按如下所示输入每列名称,它将返回所有重复的行集:
df[df[['product_uid', 'product_title', 'user']].duplicated() == True]
或者,
df[df[['product_uid', 'product_title', 'user']].duplicated()]
解决方案 5:
df[df['ID'].duplicated() == True]
这对我有用
解决方案 6:
sort("ID")
现在似乎不起作用,根据排序文档似乎已被弃用,因此sort_values("ID")
改为使用在重复过滤器后进行排序,如下所示:
df[df.ID.duplicated(keep=False)].sort_values("ID")
解决方案 7:
您可以使用:
df[df.duplicated(['ID'])==True].sort_values('ID')
所有列值的重复行及其索引位置 #
def dup_rows_index(df):
dup = df[df.duplicated()]
print('Duplicated index loc:',dup[dup == True ].index.tolist())
return dup
解决方案 8:
这可能不是问题的解决方案,但可以举例说明:
import pandas as pd
df = pd.DataFrame({
'A': [1,1,3,4],
'B': [2,2,5,6],
'C': [3,4,7,6],
})
print(df)
df.duplicated(keep=False)
df.duplicated(['A','B'], keep=False)
输出:
A B C
0 1 2 3
1 1 2 4
2 3 5 7
3 4 6 6
0 False
1 False
2 False
3 False
dtype: bool
0 True
1 True
2 False
3 False
dtype: bool
解决方案 9:
使用逐元素逻辑或并将 pandas duplicated 方法的 take_last 参数设置为 True 和 False,您可以从数据框中获取包含所有重复项的集合。
df_bigdata_duplicates =
df_bigdata[df_bigdata.duplicated(cols='ID', take_last=False) |
df_bigdata.duplicated(cols='ID', take_last=True)
]
解决方案 10:
因为我的数据库.duplicated(keep=False)
只有在对列进行排序后才可以工作。
data.sort_values(by=['Order ID'], inplace=True)
df = data[data['Order ID'].duplicated(keep=False)]
解决方案 11:
此代码为您提供一个数据框,指示某一行在数据框中是否有重复:
df2 = df1.duplicated()
此代码消除了重复并仅保留一个实例:
df3 = df1.drop_duplicates(keep="first")
df3
将是一个由唯一项目(行)组成的数据框。
解决方案 12:
总结
这对我有用:
dups = [i for i, v in df["Col1"].value_counts().iteritems() if v > 1]
dups
输出:
[501, 505]
列出重复的行:
fltr = df["Col1"].isin(dups) # Filter
df[fltr]
输出:
Col1 Col2
0 501 D
1 501 H
2 505 E
3 501 E
4 505 M
解释:
取value_counts()
一列,比如Col1,返回以下Series
内容:
以列数据
Col1
作为Series
索引。将值的数量
Col1
作为Series
值。
例如value_counts()
以下内容DataFrame
:
列1 | Col2 | |
---|---|---|
0 | 501 | 德 |
1 | 501 | 赫 |
2 | 505 | 埃 |
3 | 501 | 埃 |
4 | 505 | 米 |
5 | 502 | 一个 |
6 | 503 | 否 |
df["Col1"].value_counts()
输出如下Series
:
501 3
505 2
502 1
503 1
Name: Col1, dtype: int64
现在iteritems()
我们可以访问对象的索引和值Series
:
dups = [i for i, v in df["Col1"].value_counts().iteritems() if v > 1]
dups
输出:
[501, 505]
现在使用捕获的重复值作为原始值的过滤器DataFrame
。
fltr = df["Col1"].isin(dups) # Filter
df[fltr]
Col1 Col2
0 501 D
1 501 H
2 505 E
3 501 E
4 505 M
解决方案 13:
受上述解决方案的启发,您可以进一步对值进行排序,以便查看重复排序的记录:
df[df.duplicated(['ID'], keep=False)].sort_values(by='ID')
扫码咨询,免费领取项目管理大礼包!