使用pandas模块创建成绩簿

时间:2014-05-22 18:27:31

标签: python-2.7 pandas

所以我最近开始教授一门课程,并希望使用python和pandas模块来处理我的成绩。对于本课程,学生分组工作,每桌分配一个作业。我有一个文件,所有学生的格式都是这样的

Name, Email, Table
"John Doe", jdoe@school.edu, 3
"Jane Doe", jane@gmail.com, 5
.
.
.

和另一个文件,其中包含完成作业的每个表的成绩

Table, worksheet, another assignment, etc
1, 8, 15, 4
2, 9, 23, 5
3, 3, 20, 7
.
.
.

我想要做的是根据每个学生的桌号为每个学生分配适当的成绩。这就是我所做的

import pandas as pd

t_data = pd.read_csv('table_grades.csv')
roster = pd.read_csv('roster.csv')

for i in range(1, len(t_data.columns)):
    x = []
    for j in range(len(roster)):
        for k in range(len(t_data)): 
            if roster.Table.values[j] == k+1:
                x.append(t_data[t_data.columns.values[i]][k])
    roster[t_data.columns.values[i]] = x

我想要的是什么,但我觉得必须有更好的方法来使用熊猫这样做这样的任务。我是熊猫新手,感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

IIUC - 遗憾的是,您的代码没有为我运行您的数据并且您没有提供示例输出,因此我无法确定 - 您正在寻找merge。将新学生Fred Smith添加到表3中:

In [182]: roster.merge(t_data, on="Table")
Out[182]: 
         Name               Email  Table  worksheet  another assignment  etc
0    John Doe     jdoe@school.edu      3          3                  20    7
1  Fred Smith  fsmith@example.com      3          3                  20    7

[2 rows x 6 columns]

或者可能是外部合并,以便更容易发现丢失/未对齐的数据:

In [183]: roster.merge(t_data, on="Table", how="outer")
Out[183]: 
         Name               Email  Table  worksheet  another assignment  etc
0    John Doe     jdoe@school.edu      3          3                  20    7
1  Fred Smith  fsmith@example.com      3          3                  20    7
2    Jane Doe      jane@gmail.com      5        NaN                 NaN  NaN
3         NaN                 NaN      1          8                  15    4
4         NaN                 NaN      2          9                  23    5

[5 rows x 6 columns]

答案 1 :(得分:0)

我会做这样的事情

import pandas as pd
from StringIO import StringIO

roster = pd.read_csv(\
    StringIO("""Name,Email,Table
                'John Doe', jdoe@school.edu, 1
                'Jane Doe', jane@gmail.com, 3
                'Jack Doe', jack@gmail.com, 2"""))

t_data = pd.read_csv(\
    StringIO("""Table,worksheet,another assignment,etc
                1, 8, 15, 4
                2, 9, 23, 5
                3, 3, 20, 7"""))

roster=roster.set_index('Table')
res = pd.concat((roster.loc[t_data.Table].set_index(t_data.index), t_data), axis=1)

结果是

                         Name             Email  Table  worksheet  another assignment  etc
0                  'John Doe'   jdoe@school.edu      1          8                  15    4
1                  'Jack Doe'    jack@gmail.com      2          9                  23    5
2                  'Jane Doe'    jane@gmail.com      3          3                  20    7