如何从重复行的子集中识别和删除行唯一值?



我有一个数据框架,它的行几乎是重复的,除了一列的值。

event = [1, 1, 1, 1, 2, 2, 2, 2, 3, 3]
subj = [1, 1, 2, 2, 3, 3, 4, 4, 5, 6]
age = [22, 22, 56, 56, 32, 32, 48, 48, 19, 43]
sex = ['F', 'F','M',' M', 'M', 'M',' F',' F', 'F', 'M']
fruit = ['apple', 'orange', 'apple', 'orange', 'grape', 'mango', 'grape', 'mango', 'apple', 'mango']
df = pd.DataFrame(list(zip(event, subj, age, sex, fruit)),
columns =['event', 'subj', 'age', 'sex', 'fruit'])

每个受试者与两种水果(苹果/橙子或葡萄/芒果)相关联。我想省略一些行,以便每个主题只与一种水果相关联,并且每个主题与一种不同的水果相关联。

这是我想要的最终数据帧的样子:

event = [1, 1, 2, 2, 3, 3]
subj = [1, 2, 3, 4, 5, 6]
age = [22, 56, 32, 48, 19, 43]
sex = ['F', 'M', 'M', 'F', 'F', 'M']
fruit = ['apple', 'orange', 'grape', 'mango', 'apple', 'mango']
df_new = df = pd.DataFrame(list(zip(event, subj, age, sex, fruit)),
columns =['event', 'subj', 'age', 'sex', 'fruit'])

我有数千行,不知道哪些行是"几乎重复的"。我试过使用.duplicate()基于一个子集,但它只允许我保持第一个或最后一个,所以不同的主题最终与相同的水果(例如,主题1和2与'苹果'和主题3和4与'葡萄')。

我对熊猫不熟悉,任何帮助都将非常感激。

编辑:为了澄清我问题中的一些含糊之处——在每个事件中,主题应该是唯一的。活动内的主题应与不同的水果相关联。每个事件可以有两个以上的主题,但每个主题不应与一个以上的事件相关联(例如,如果主题1出现在事件1中,则不应出现在其他事件中)。

应该可以:

df['check'] = (
df.groupby(["event"])
.apply(lambda x: x['fruit'].shift(1)==x['fruit'].shift(-1))
.reset_index(drop=True)
)
df=df[df['check']==False].drop(['check'],axis=1)
print(df)
'''
event  subj  age sex   fruit
0      1     1   22   F   apple
3      1     2   56   M  orange
4      2     3   32   M   grape
7      2     4   48   F   mango
8      3     5   19   F   apple
9      3     6   43   M   mango
'''

最新更新