我有三个不同的.csv文件,其中包含针对三种不同作业的学生的成绩。我想用大熊猫读它们,并计算每个学生的平均值。每个文件的模板为:
Student id, Mark, extra fields, ...
4358975489, 9, ... ...
2345234523, 10, ... ...
7634565323, 7, ... ...
7653563366, 7, ... ...
... ..., ... ...
第二项作业:
Student id, Mark, extra fields, ...
4358975489, 6, ... ...
2345234523, 8, ... ...
7634565323, 4, ... ...
7653563366, 5, ... ...
... ..., ... ...
例如两个文档的所需输出:
Student id, average, extra fields, ...
4358975489, 7.5, ... ...
2345234523, 9, ... ...
7634565323, 5.5, ... ...
7653563366, 6, ... ...
... ..., ... ...
与上一个文档相同。我想分别阅读这些文档,并针对每个学生ID进行平均分。
现在,我用于读取一个文件的代码如下:
i_df1 = pandas.read_csv('first.csv')
i_df2 = pandas.read_csv('second.csv')
i_df3 = pandas.read_csv('third.csv')
print (o_df.keys())
for i, row in i_df1.iterrows():
pdb.set_trace()
如何同时处理所有三个文件并提取平均成绩?
答案 0 :(得分:1)
使用pd.concat连接3 df:
i_df1 = pandas.read_csv('first.csv')
i_df2 = pandas.read_csv('second.csv')
i_df3 = pandas.read_csv('third.csv')
df = pd.concat([i_df1, i_df2, i_df3])
df.groupby('Student id').agg({'Mark':'mean'})
答案 1 :(得分:1)
如果您要一起处理所有dfs
,则可以执行以下操作:
df = df1.append([df2, df3]).groupby('Student id', as_index=False).mean()
或:
如果您想同时进行操作,可以将list comprehension
与df.append
和mean
结合使用:
以下是您的list
中的dfs
:
In [1220]: df_list = [i_df1, i_df2, i_df3]
您可以同时在文件中找到每个学生的平均值,并将输出存储在另一个list
中:
In [1223]: df = [i.groupby('Student_id', as_index=False).mean() for i in df_list]
答案 2 :(得分:1)
您还可以使用文件名并将数据帧直接串联在一起:
fnames = ["first.csv", "second.csv", "third.csv"]
df = pd.concat(pd.read_csv(fname) for fname in fnames)
df.groupby("Student id")["Mark"].mean()
实际上几乎无关紧要,但无论如何可能还是很高兴:这种方法不会将数据加载到内存中两次,而只会加载一次。
答案 3 :(得分:1)
使用您给出的数据(假设它们获得三分相同的得分)
import pandas as pd
import numpy as np
data = [
[4358975489, 9],
[2345234523, 10],
[7634565323, 7]]
data = np.array(data)
data = pd.DataFrame(data, columns=["student", "mark"])
data1 = pd.DataFrame(data, columns=["student", "mark"])
data2 = pd.DataFrame(data, columns=["student", "mark"])
std_maks = pd.concat([data, data1, data2]).groupby('student')
print(std_maks['mark'].mean())