如何根据列中的值删除重复的行

How to remove duplicated rows based on values in column

大家早上好。所以我的问题是从数据框中删除由其中一列中的许多不同值引起的重复项。

基础数据框如下所示:

如您所见,我在 Name 和 Id 列中有重复值,具体取决于类别。 我们的目标是删除这些重复项,同时保留有关类别的信息。

我想要准确的视图如下:

我尝试使用 pandas 库中的 get_dummies 方法,但我遇到了一些问题。

dummies = pd.get_dummies(df[['Category']], drop_first=True)
df = pd.concat([df.drop(['Category'], axis=1), dummies], axis=1)

使用上面的代码我得到如下结果:

结果与基本数据帧基本相同。

你们知道怎么处理吗?

这取决于什么需要 - 如果可能,每个 Name 重复并且 Id 是必要的聚合 max:

df = (pd.get_dummies(df, columns=['Category'])
        .groupby(['Name','Id'], as_index=False)
         .max())
print (df)
  Name  Id  Category_A  Category_B  Category_C
0  ABC   1           1           0           0
1  ABC   2           0           1           0
2  DEF   2           1           0           0
3  GHI   3           0           0           1
4  JKL   4           0           0           1
5  MNO   5           1           0           0

如果需要将每个 Id 与非数值的最后一个值进行汇总,请使用:

f = lambda x: x.max() if np.issubdtype(x.dtype, np.number) else x.iat[-1]
df = (pd.get_dummies(df, columns=['Category'])
        .groupby('Id', as_index=False)
         .agg(f))
print (df)
   Id Name  Category_A  Category_B  Category_C
0   1  ABC           1           0           0
1   2  DEF           1           1           0
2   3  GHI           0           0           1
3   4  JKL           0           0           1
4   5  MNO           1           0           0

在第二种解决方案中,可以为聚合指定列:

# f = lambda x: x.max() if np.issubdtype(x.dtype, np.number) else x.iat[-1]
df = pd.get_dummies(df, columns=['Category'])
         
d = dict.fromkeys(df.columns, 'max')
d['Name'] = 'last'
print (d)
{'Name': 'last', 'Id': 'max', 'Category_A': 'max', 'Category_B': 'max', 'Category_C': 'max'}

df = df.groupby('Id', as_index=False).agg(d)
print (df)
  Name  Id  Category_A  Category_B  Category_C
0  ABC   1           1           0           0
1  DEF   2           1           1           0
2  GHI   3           0           0           1
3  JKL   4           0           0           1
4  MNO   5           1           0           0