pandas排序/单列中的平均数字/文本数据

时间:2018-04-06 14:45:23

标签: python pandas

我的数据分为3栏(姓名,问题,回复),这些数据来自评判学生研究座谈会。水平(研究生/本科)有2种可能的选择,大学有5种(科学,教育等)

我需要做的是获取给定名称的数字响应的平均值,并按该人的平均数字分数排序,以输出包含以下内容的表:

College  Level    Rank
science  graduate  1st
science  graduate  2nd
science  graduate  3rd

science undergrad 1st
...

education graduate 1st
...
education undergrad 3rd

这是一个示例数据表:

name          question  response
Smith, John     Q1      10
Smith, John     Q2       7
Smith, John     Q3      10
Smith, John     Q4      8
Smith, John     Q5      10
Smith, John     Q8      8
Smith, John     level   graduate
Smith, John     colleg  science
Smith, John     Q9      4
Jones, Mary     Q3      10
Jones, Mary     Q2      10
Jones, Mary     Q1      10
Jones, Mary     Q4      10
Jones, Mary     level   undergraduate
Jones, Mary     college education
Jones, Mary     Q6      10
Jones, Mary     Q7      10
Jones, Mary     Q9      10

一位才华横溢的学生使用数据透视表在excel中为我们做了这个,但我确信这可以用熊猫来完成,而且我非常好奇如何做到这一点(我很陌生)到熊猫)。棘手的部分是所有有用的'信息在第3栏中。

2 个答案:

答案 0 :(得分:1)

将响应列转换为数字,字符串将为na然后是groupby和aggregate

import pandas as pd
import numpy as np
import StringIO


data = '''name;question;response
Smith, John;Q1;10
Smith, John;Q2;7
Smith, John;Q3;10
Smith, John;Q4;8
Smith, John;Q5;10
Smith, John;Q8;8
Smith, John;level;graduate
Smith, John;colleg;science
Smith, John;Q9;4
Jones, Mary;Q3;10
Jones, Mary;Q2;10
Jones, Mary;Q1;10
Jones, Mary;Q4;10
Jones, Mary;level;undergraduate
Jones, Mary;college;education
Jones, Mary;Q6;10
Jones, Mary;Q7;10
Jones, Mary;Q9;10'''

df = pd.read_csv(StringIO.StringIO(data), delimiter=';')
df['response'] = pd.to_numeric(df['response'], errors='coerce')
df.groupby('name').agg(np.mean).reset_index().sort_values(by='response')

输出

    name    response
1   Smith, John 8.142857
0   Jones, Mary 10.000000

答案 1 :(得分:0)

您可以开始透视数据框,以获取大学和级别的信息以及不同数据框中的问号:

pivoted = df.pivot_table(index='name',
                         columns='question',
                         values='response',
                         fill_value=np.nan, # Changing this value to 0 would consider 
                                            # unanswered questions as 0 score
                         aggfunc=lambda x: x)
categories = pivoted[['college','level']]
questions = pivoted.drop(['college','level'],axis=1)

并在类别数据框中为每个学生设置问号平均值:

categories['points'] = questions.astype(float).mean(axis=1,skipna=True)

skipna=Truefill_value=np.nan相结合,使得无法回答的问题无法平均计算,因此,只有一个答案为10的学生将具有平均值10.评论时,{{1修改此行为。

最终,可以使用fill_value=0对值进行排序,以便对每个类别进行排名:

sort_values