如何在pandas数据框中获取所有列的唯一值

6

我想列出 Pandas 数据框中所有列的唯一值,并将它们存储在另一个数据帧中。我尝试过这个方法,但它是按行追加的,而我想要按列追加。我该怎么做?

raw_data = {'student_name': ['Miller', 'Miller', 'Ali', 'Miller'], 
        'test_score': [76, 75,74,76]}
      df2 = pd.DataFrame(raw_data, columns = ['student_name', 'test_score'])


      newDF = pd.DataFrame() 

      for column in df2.columns[0:]:
          dat = df2[column].drop_duplicates()
          df3 = pd.DataFrame(dat)
          newDF = newDF.append(df3)

print(newDF)


Expected Output:
student_name  test_score
Ali          74
Miller       75
             76

预期输出是什么?我猜测是 df2.stack().unique() - cs95
我已经更新了我的问题,包括一些重复的内容和期望的输出。谢谢。 - Kumar AK
df2 = df2.drop_duplicates() - cs95
1个回答

12
我认为你可以使用 drop_duplicates
如果想要检查一些列并保留重复的第一行:
newDF = df2.drop_duplicates('student_name')
print(newDF)
   student_name  test_score
0        Miller        76.0
1      Jacobson        88.0
2           Ali        84.0
3        Milner        67.0
4         Cooze        53.0
5         Jacon        96.0
6        Ryaner        64.0
7          Sone        91.0
8         Sloan        77.0
9         Piger        73.0
10        Riani        52.0

并感谢@cᴏʟᴅsᴘᴇᴇᴅ提供的另一种解决方案:

df2[~df2.student_name.duplicated()]

但是如果想要一起检查所有列是否有重复,请保留第一个行:


newDF = df2.drop_duplicates()
print(newDF)
   student_name  test_score
0        Miller        76.0
1      Jacobson        88.0
2           Ali        84.0
3        Milner        67.0
4         Cooze        53.0
5         Jacon        96.0
6        Ryaner        64.0
7          Sone        91.0
8         Sloan        77.0
9         Piger        73.0
10        Riani        52.0
11          Ali         NaN

由新样本编辑 - 删除重复项并按两列排序:

newDF = df2.drop_duplicates().sort_values(['student_name', 'test_score'])
print(newDF)
  student_name  test_score
2          Ali          74
1       Miller          75
0       Miller          76

编辑1:如果想将副本通过第一列替换为NaN

newDF = df2.drop_duplicates().sort_values(['student_name', 'test_score'])
newDF['student_name'] = newDF['student_name'].mask(newDF['student_name'].duplicated())
print(newDF)
  student_name  test_score
2          Ali          74
1       Miller          75
0          NaN          76

编辑2:更通用的解决方案:

newDF = df2.sort_values(df2.columns.tolist())
           .reset_index(drop=True)‌
           ​.apply(lambda x: x.drop_duplicates()) 

1
还是只需要 df2[~df2.student_name.duplicated()] - cs95
这不是我想要的输出结果,我已经更新了我的问题并提供了所需的输出结果,请您查看一下。谢谢。 - Kumar AK
@KumarAK - 请检查最后一次编辑,我认为最好的是 df2.drop_duplicates().sort_values(['student_name', 'test_score']) - jezrael
如果您不想在第一列中出现重复项,则需要将它们替换为 NaN,解决方案在 EDIT1 中。 - jezrael
谢谢,我明白了。但是问题在于我不想让列名固定,它应该是动态的。 - Kumar AK
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接