Python Pandas 中删除跨多列的所有重复行
- 2024-11-27 10:43:00
- admin 原创
- 11
问题描述:
pandasdrop_duplicates
函数非常适合“唯一化”数据框。我想删除列子集中所有重复的行。这可能吗?
A B C
0 foo 0 A
1 foo 1 A
2 foo 1 B
3 bar 1 A
举个例子,我想删除与列匹配的行A
,C
因此这应该删除第 0 行和第 1 行。
解决方案 1:
现在,使用drop_duplicates和 keep 参数,在 pandas 中做到这一点变得容易得多。
import pandas as pd
df = pd.DataFrame({"A":["foo", "foo", "foo", "bar"], "B":[0,1,1,1], "C":["A","A","B","A"]})
df.drop_duplicates(subset=['A', 'C'], keep=False)
解决方案 2:
只想补充一下 Ben 关于drop_duplicates的回答:
keep
:{'first','last',False},默认'first'
first :删除除第一次出现之外的重复项。
last :删除除最后一次出现的重复项之外的所有重复项。
False :删除所有重复项。
因此设置keep
为 False 将给出您想要的答案。
DataFrame.drop_duplicates(args, *kwargs) 返回删除重复行的 DataFrame,可选择仅考虑某些列
参数: subset:列标签或标签序列,可选 仅考虑某些列来识别重复项,默认情况下使用所有列 keep:{'first','last',False},默认'first' first:删除除第一次出现之外的重复项。 last:删除除最后一次出现之外的重复项。 False:删除所有重复项。 take_last:已弃用 inplace:布尔值,默认 False 是否就地删除重复项或返回副本 cols:kwargs 子集的唯一参数[已弃用] 返回: deduplicated:DataFrame
解决方案 3:
如果您希望将结果存储在另一个数据集中:
df.drop_duplicates(keep=False)
或者
df.drop_duplicates(keep=False, inplace=False)
如果需要更新相同的数据集:
df.drop_duplicates(keep=False, inplace=True)
上面的例子将删除所有重复项并保留一个,类似于DISTINCT *
SQL
解决方案 4:
使用groupby
和filter
import pandas as pd
df = pd.DataFrame({"A":["foo", "foo", "foo", "bar"], "B":[0,1,1,1], "C":["A","A","B","A"]})
df.groupby(["A", "C"]).filter(lambda df:df.shape[0] == 1)
解决方案 5:
尝试以下各种方法
df = pd.DataFrame({"A":["foo", "foo", "foo", "bar","foo"], "B":[0,1,1,1,1], "C":["A","A","B","A","A"]})
>>>df.drop_duplicates( "A" , keep='first')
或者
>>>df.drop_duplicates( keep='first')
或者
>>>df.drop_duplicates( keep='last')
解决方案 6:
实际上,仅需要删除第 0 行和第 1 行(保留任何包含匹配的 A 和 C 的观察结果):
In [335]:
df['AC']=df.A+df.C
In [336]:
print df.drop_duplicates('C', take_last=True) #this dataset is a special case, in general, one may need to first drop_duplicates by 'c' and then by 'a'.
A B C AC
2 foo 1 B fooB
3 bar 1 A barA
[2 rows x 4 columns]
但我怀疑你真正想要的是这个(保留一个包含匹配的 A 和 C 的观察结果):
In [337]:
print df.drop_duplicates('AC')
A B C AC
0 foo 0 A fooA
2 foo 1 B fooB
3 bar 1 A barA
[3 rows x 4 columns]
编辑:
因此,现在情况更加清楚了:
In [352]:
DG=df.groupby(['A', 'C'])
print pd.concat([DG.get_group(item) for item, value in DG.groups.items() if len(value)==1])
A B C
2 foo 1 B
3 bar 1 A
[2 rows x 3 columns]
解决方案 7:
您可以使用duplicated()
标记所有重复项并过滤掉标记的行。如果您需要new_df
稍后分配列,请务必调用,.copy()
以免SettingWithCopyWarning
稍后出现问题。
new_df = df[~df.duplicated(subset=['A', 'C'], keep=False)].copy()
此方法的一个优点是您可以有条件地删除重复项。例如,要仅当 A 列等于时才删除所有重复的行'foo'
,您可以使用以下代码。
new_df = df[~( df.duplicated(subset=['A', 'B', 'C'], keep=False) & df['A'].eq('foo') )].copy()
另外,如果您不想按名称写出列,则可以将 的切片传递df.columns
给subset=
。 这也适用于drop_duplicates()
。
# to consider all columns for identifying duplicates
df[~df.duplicated(subset=df.columns, keep=False)].copy()
# the same is true for drop_duplicates
df.drop_duplicates(subset=df.columns, keep=False)
# to consider columns in positions 0 and 2 (i.e. 'A' and 'C') for identifying duplicates
df.drop_duplicates(subset=df.columns[[0, 2]], keep=False)
解决方案 8:
如果您想使用 try 和 except 语句检查 2 列,那么这一个可以提供帮助。
if "column_2" in df.columns:
try:
df[['column_1', "column_2"]] = df[['header', "column_2"]].drop_duplicates(subset = ["column_2", "column_1"] ,keep="first")
except:
df[["column_2"]] = df[["column_2"]].drop_duplicates(subset="column_2" ,keep="first")
print(f"No column_1 for {path}.")
try:
df[["column_1"]] = df[["column_1"]].drop_duplicates(subset="column_1" ,keep="first")
except:
print(f"No column_1 or column_2 for {path}.")
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 项目管理必备:盘点2024年13款好用的项目管理软件