我的数据分为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栏中。
答案 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=True
与fill_value=np.nan
相结合,使得无法回答的问题无法平均计算,因此,只有一个答案为10的学生将具有平均值10.评论时,{{1修改此行为。
最终,可以使用fill_value=0
对值进行排序,以便对每个类别进行排名:
sort_values