gpt4 book ai didi

python - 查找多列中的重复项并删除行 - Pandas

转载 作者:太空宇宙 更新时间:2023-11-03 16:20:09 24 4
gpt4 key购买 nike

如果该名称出现在任何后续行中,我想删除该行。主要是我不确定如何获取找到重复项的索引,然后使用该索引号将其从 df 中删除。

import pandas as pd
data = {'interviewer': ['Jason', 'Molly', 'Jermaine', 'Jake', 'Amy'],
'candidate': ['Bob', 'Jermaine', 'Ahmed', 'Karl', 'Molly'],
'year': [2012, 2012, 2013, 2014, 2014],
'reports': [4, 24, 31, 2, 3]}

df = pd.DataFrame(data)
#names = pd.unique(df[['interviewer', 'candidate']].values.ravel()).tolist()

mt = []

for i, c in zip(df.interviewer, df.candidate):
print i, c
if i not in mt:
if c not in mt:
mt.append(df.loc[(df.interviewer == i) & (df.candidate == c)] )
else:
continue

我的想法是使用mt作为列表传递给df.drop并删除具有这些索引的行。我想要的结果是没有看到 Molly 或 Jermaine 再次出现在索引 2 或 4 中 - df.drop([2,4], inplace=True)

已编辑

我找到了一种方法来创建要传递给 drop 的索引列表:

import pandas as pd
data = {'interviewer': ['Jason', 'Molly', 'Jermaine', 'Jake', 'Amy'],
'candidate': ['Bob', 'Jermaine', 'Ahmed', 'Karl', 'Molly'],
'year': [2012, 2012, 2013, 2014, 2014],
'reports': [4, 24, 31, 2, 3]}

df = pd.DataFrame(data)
#print df
counter = -1
bad_rows = []
names = []
for i, c in zip(df.interviewer, df.candidate):
print i, c

counter += 1
print counter
if i not in names:
names.append(i)
else:
bad_rows.append(counter)
if c not in names:
names.append(c)
else:
bad_rows.append(counter)

#print df.drop(bad_rows)

但是必须有一种更聪明的方法来做到这一点,也许@Ami_Tavory对itertools的回答?

最佳答案

(在撰写此答案时,口头描述与代码示例之间存在一些差异。)

您可以使用isin检查某个项目是否出现在不同的列中,如下所示:

In [5]: df.candidate.isin(df.interviewer)
Out[5]:
0 False
1 True
2 False
3 False
4 True
Name: candidate, dtype: bool

因此,您可以执行类似的操作

df[~df.candidate.isin(df.interviewer)]

请注意,这与您的原始代码匹配,而不是您对后续行的规范。如果您只想删除后续行,我会使用 itertools,例如:

In [18]: bads = [i for ((i, cn), (j, iv)) in itertools.product(enumerate(df.candidate), enumerate(df.interviewer)) if j >=i and cn == iv]

In [19]: df[~df.index.isin(bads)]
Out[19]:
candidate interviewer reports year
0 Bob Jason 4 2012
2 Ahmed Jermaine 31 2013
3 Karl Jake 2 2014
4 Molly Amy 3 2014

此外,如果您想删除后续行,只需将其更改为

In [18]: bads = [j for ((i, cn), (j, iv)) in itertools.product(enumerate(df.candidate), enumerate(df.interviewer)) if j >=i and cn == iv]

关于python - 查找多列中的重复项并删除行 - Pandas,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38555922/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com