如果名称出现在任何后续行中,我想删除该行。主要是我不知道如何获得找到重复的索引,然后使用该索引号从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)
。
EDITED
,我想出了一个方法来创建索引我想的列表传递给降:
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的东西?
你可能想看看这个:http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.drop_duplicates.html – albert
我想'df.drop_duplicates([ '候选人','面试官'])'但这只在两者匹配时才起作用。我正在寻找'当发现名称 - 删除行功能 – noblerthanoedipus