【问题标题】:Pandas groupby and get nunique of multiple columns in a dataframePandas groupby 并获取数据框中多列的唯一性
【发布时间】:2023-01-23 15:02:37
【问题描述】:

我有一个如下所示的数据框

stu_id,Mat_grade,sci_grade,eng_grade
1,A,C,A
1,A,C,A
1,B,C,A
1,C,C,A
2,D,B,B
2,D,C,B
2,D,D,C
2,D,A,C

tf = pd.read_clipboard(sep=',')

我的目标是

a) 找出学生在Mat_gradesci_gradeeng_grade下获得了多少个不同的唯一成绩

所以,我尝试了以下

tf['mat_cnt'] = tf.groupby(['stu_id'])['Mat_grade'].nunique()
tf['sci_cnt'] = tf.groupby(['stu_id'])['sci_grade'].nunique()
tf['eng_cnt'] = tf.groupby(['stu_id'])['eng_grade'].nunique() 

但这并没有提供预期的输出。因为,我有超过 100K 个唯一 ID,任何高效优雅的解决方案都非常有帮助

我希望我的输出如下所示

【问题讨论】:

  • tf.groupby('stu_id').nunique()怎么样?
  • @ShubhamSharma - 感谢您的建议。在示例中,我没有提供额外的列,但在实际数据中,有额外的列。因此,不需要所有列的唯一性。但是,是的,从你那里知道它也可以对整个数据框完成很有用
  • 如果在这种情况下您有多个列,您可以使用以下方式过滤所需的列:tf.filter(like='_grade').groupby('stu_id').nunique()

标签: python pandas list dataframe pandas-groupby


【解决方案1】:

您可以在列表中指定列名称,并为列 cols 调用 DataFrameGroupBy.nuniquerename

cols = ['Mat_grade','sci_grade', 'eng_grade']
new = ['mat_cnt','sci_cnt','eng_cnt']
d = dict(zip(cols, new))
df = tf.groupby(['stu_id'], as_index=False)[cols].nunique().rename(columns=d)
print (df)
   stu_id  mat_cnt  sci_cnt  eng_cnt
0       1        3        1        1
1       2        1        4        2

另一个想法是使用命名聚合:

cols = ['Mat_grade','sci_grade', 'eng_grade']
new = ['mat_cnt','sci_cnt','eng_cnt']
d = {v: (k,'nunique') for k, v in zip(cols, new)}
print (d)
{'mat_cnt': ('Mat_grade', 'nunique'), 
 'sci_cnt': ('sci_grade', 'nunique'), 
 'eng_cnt': ('eng_grade', 'nunique')}

df = tf.groupby(['stu_id'], as_index=False).agg(**d)
print (df)
   stu_id  mat_cnt  sci_cnt  eng_cnt
0       1        3        1        1
1       2        1        4        2

【讨论】:

    猜你喜欢
    • 2023-02-07
    • 1970-01-01
    • 2022-01-26
    • 2020-11-11
    • 2013-07-14
    • 2021-02-26
    • 1970-01-01
    • 2023-01-18
    相关资源
    最近更新 更多