我运行的一个实验的30次重复运行中有30个csv数据文件。我正在使用pandas'read_csv()
函数将数据读入DataFrames列表。我想从此列表中创建一个DataFrame,其中包含每列的30个DataFrame的平均值。是否有内置的方法来实现这一目标?
为了澄清,我将在下面的答案中扩展示例。假设我有两个DataFrame:
>>> x
A B C
0 -0.264438 -1.026059 -0.619500
1 0.927272 0.302904 -0.032399
2 -0.264273 -0.386314 -0.217601
3 -0.871858 -0.348382 1.100491
>>> y
A B C
0 1.923135 0.135355 -0.285491
1 -0.208940 0.642432 -0.764902
2 1.477419 -1.659804 -0.431375
3 -1.191664 0.152576 0.935773
我应该用什么合并函数来制作一个使用DataFrame排序的3D数组?如,
>>> automagic_merge(x, y)
A B C
0 [-0.264438, 1.923135] [-1.026059, 0.135355] [-0.619500, -0.285491]
1 [ 0.927272, -0.208940] [ 0.302904, 0.642432] [-0.032399, -0.764902]
2 [-0.264273, 1.477419] [-0.386314, -1.659804] [-0.217601, -0.431375]
3 [-0.871858, -1.191664] [-0.348382, 0.152576] [ 1.100491, 0.935773]
所以我可以在这些列表而不是整列上计算平均值,s.e.m.等。
答案 0 :(得分:7)
检查出来:
In [14]: glued = pd.concat([x, y], axis=1, keys=['x', 'y'])
In [15]: glued
Out[15]:
x y
A B C A B C
0 -0.264438 -1.026059 -0.619500 1.923135 0.135355 -0.285491
1 0.927272 0.302904 -0.032399 -0.208940 0.642432 -0.764902
2 -0.264273 -0.386314 -0.217601 1.477419 -1.659804 -0.431375
3 -0.871858 -0.348382 1.100491 -1.191664 0.152576 0.935773
In [16]: glued.swaplevel(0, 1, axis=1).sortlevel(axis=1)
Out[16]:
A B C
x y x y x y
0 -0.264438 1.923135 -1.026059 0.135355 -0.619500 -0.285491
1 0.927272 -0.208940 0.302904 0.642432 -0.032399 -0.764902
2 -0.264273 1.477419 -0.386314 -1.659804 -0.217601 -0.431375
3 -0.871858 -1.191664 -0.348382 0.152576 1.100491 0.935773
In [17]: glued = glued.swaplevel(0, 1, axis=1).sortlevel(axis=1)
In [18]: glued
Out[18]:
A B C
x y x y x y
0 -0.264438 1.923135 -1.026059 0.135355 -0.619500 -0.285491
1 0.927272 -0.208940 0.302904 0.642432 -0.032399 -0.764902
2 -0.264273 1.477419 -0.386314 -1.659804 -0.217601 -0.431375
3 -0.871858 -1.191664 -0.348382 0.152576 1.100491 0.935773
为了记录,交换关卡和重新排序不是必要的,只是出于视觉目的。
然后你可以做类似的事情:
In [19]: glued.groupby(level=0, axis=1).mean()
Out[19]:
A B C
0 0.829349 -0.445352 -0.452496
1 0.359166 0.472668 -0.398650
2 0.606573 -1.023059 -0.324488
3 -1.031761 -0.097903 1.018132
答案 1 :(得分:2)
我想出了一种方法。
pandas DataFrames可以与DataFrame.add()函数一起添加:http://pandas.sourceforge.net/generated/pandas.DataFrame.add.html
所以我可以将DataFrames加在一起然后除以DataFrames的数量,例如:
avgDataFrame = DataFrameList[0]
for i in range(1, len(DataFrameList)):
avgDataFrame = avgDataFrame.add(DataFrameList[i])
avgDataFrame = avgDataFrame / len(DataFrameList)
答案 2 :(得分:1)
查看pandas.concat()
功能。当您读入文件时,可以使用concat
将生成的DataFrames合并为一个,然后使用普通的pandas平均技术对其进行平均。
要使用它,只需将您希望连接在一起的DataFrame列表传递给它:
>>> x
A B C
0 -0.264438 -1.026059 -0.619500
1 0.927272 0.302904 -0.032399
2 -0.264273 -0.386314 -0.217601
3 -0.871858 -0.348382 1.100491
>>> y
A B C
0 1.923135 0.135355 -0.285491
1 -0.208940 0.642432 -0.764902
2 1.477419 -1.659804 -0.431375
3 -1.191664 0.152576 0.935773
>>> pandas.concat([x, y])
A B C
0 -0.264438 -1.026059 -0.619500
1 0.927272 0.302904 -0.032399
2 -0.264273 -0.386314 -0.217601
3 -0.871858 -0.348382 1.100491
0 1.923135 0.135355 -0.285491
1 -0.208940 0.642432 -0.764902
2 1.477419 -1.659804 -0.431375
3 -1.191664 0.152576 0.935773