处理熊猫上的多个csv文件

时间:2020-11-09 14:28:58

标签: python pandas dataframe csv

我有三个不同的.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()

如何同时处理所有三个文件并提取平均成绩?

4 个答案:

答案 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 comprehensiondf.appendmean结合使用:

以下是您的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())