使用pandas汇总来自多个csv文件的数据

时间:2016-01-15 16:41:40

标签: python csv python-3.x pandas

我的-many-csv文件具有相同数量的列(不同行数),具有以下模式:

档案1:

A1,B1,C1
A2,B2,C2
A3,B3,C3
A4,B4,C4

文件2:

*A1*,*B1*,*C1*
*A2*,*B2*,*C2*
*A3*,*B3*,*C3*

档案......

输出:

A1+*A1*+...,B1+*B1*+...,C1+*C1*+...
A2+*A2*+...,B2+*B2*+...,C2+*C2*+...
A3+*A3*+...,B3+*B3*+...,C3+*C3*+...
A4+...     ,B4+...     ,C4+...

例如:

档案1:

1,0,0
1,0,1
1,0,0
0,1,0

文件2:

1,1,0
1,1,1
0,1,0

输出:

2,1,0
2,1,2
1,1,0
0,1,0

我正在尝试使用python.pandas并且正在考虑这样的事情来创建读取变量:

dic={}
for i in range(14253,14352):
        try:
                dic['df_{0}'.format(i)]=pandas.read_csv('output_'+str(i)+'.csv')
        except:
                pass

然后总结列:

for residue in residues:
       for number in range(14254,14255):
               df=dic['df_14253'][residue]
               df+=dic['df_'+str(number)][residue]

残基是一个字符串列表,它是列名。

我遇到的问题是我的文件有不同的行数,只是总结到df1的最后一行。如何将它们添加到最长文件的最后一行 - 这样就不会丢失任何数据?我认为panda的groupby.sum可能是一个选项,但我不明白如何使用它。

添加一个例子 - 现在我明白了:

档案1:

1,0,0
1,0,1
1,0,0
0,1,0

文件2:

1,1,0
1,1,1
0,1,0

文件3:

1,0,0
0,0,1
1,0,0
1,0,0
1,0,0
1,0,1

档案......:

输出:

3,1,0
2,1,3
2,1,0
1,1,0
1,0,0
1,0,1

2 个答案:

答案 0 :(得分:2)

您可以在pandas中使用Panel,3D对象,数据帧集合:

dfs={ i : pd.DataFrame.from_csv('file'+str(i)+'.csv',sep=',',\
header=None,index_col=None) for i in range(n)} # n files.
panel=pd.Panel(dfs)
dfs_sum=panel.sum(axis=0)

dfs是数据框的词典。面板完成后自动缺少Nan的值并做好总和。例如:

n [500]: panel[1]
Out[500]: 
     0   1   2
0    1   0   0
1    1   0   1
2    1   0   0
3    0   1   0
4  NaN NaN NaN
5  NaN NaN NaN
6  NaN NaN NaN
7  NaN NaN NaN
8  NaN NaN NaN
9  NaN NaN NaN
10 NaN NaN NaN
11 NaN NaN NaN

In [501]: panel[2]
Out[501]: 
     0   1   2
0    1   0   0
1    1   0   1
2    1   0   0
3    0   1   0
4    1   0   0
5    1   0   1
6    1   0   0
7    0   1   0
8  NaN NaN NaN
9  NaN NaN NaN
10 NaN NaN NaN
11 NaN NaN NaN

In [502]: panel[3]
Out[502]: 
    0  1  2
0   1  0  0
1   1  0  1
2   1  0  0
3   0  1  0
4   1  0  0
5   1  0  1
6   1  0  0
7   0  1  0
8   1  0  0
9   1  0  1
10  1  0  0
11  0  1  0

In [503]: panel.sum(0)
Out[503]: 
    0  1  2
0   3  0  0
1   3  0  3
2   3  0  0
3   0  3  0
4   2  0  0
5   2  0  2
6   2  0  0
7   0  2  0
8   1  0  0
9   1  0  1
10  1  0  0
11  0  1  0

答案 1 :(得分:0)

寻找同样的事情,我发现现在不建议使用面板,所以我在这里发布新闻:

unless
  

从0.20.0版开始不推荐使用:表示3-D数据的推荐方法是通过to_frame()方法或xarray包在DataFrame上使用> MultiIndex。 > Pandas提供了to_xarray()方法来自动执行此转换。

(defmethod also-working ((test test))
  (with-slots (a) test
    (iter
      (for i below 3)
      (iter
        (for j below 3)
        (unless (= 10 j) 
          (log:info "R: ~D C: ~D" i j))))))
  

将宽格式转换为DataFrame的长格式(堆叠格式),其数据列是> Panel的项目,其索引是由Panel的主要和> minor组成的MultiIndex

我建议使用 pandas.DataFrame.sum

class pandas.Panel(data=None, items=None, major_axis=None, minor_axis=None, copy=False, dtype=None)
  

参数:
  轴:{索引(0),列(1)}      要应用的功能的轴。

一个人可以像在B.M.中一样使用它。回答