为每个标头创建单独的pandas数据帧

时间:2015-03-27 20:03:57

标签: python csv pandas header

所以我有一个csv,每天包含由标题分隔的数据。无论如何我每次程序点击标题时都可以制作单独的pandas dfs吗?

数据基本上看起来像这样

#dateinformation
data1, data2, data3
data4, data5, data6
#dateinformation

真正的csv的一个例子就是这个

#7240320140101002301 131
21101400B   86    12B  110  325   25
10100000   200B    6B  110  325   77
20 95300 -9999   -27B  100-9999-9999
10 92500   820B  -39B   90  290
.....
#7240320140102002301
21101400B   86    14B  110  325   25
10100000   200B    2B  110  325   77
20 95300 -9999   -85B  100-9999-9999
10 92500   820B  -25B   90  290

我已经将实际数据的格式化得很好。我只是需要一些帮助来解决如何在csv

中分离出不同的集合

2 个答案:

答案 0 :(得分:0)

(以下代码基于以'#'开头的标题行)

我认为理论上你会用read_table和chunksize来做这件事,但实际上由于每行的字段数不同,我很难让它工作得很好。以下是相当简单的,但我确实不得不求助于它。

In [1435]: df_list = []
      ...: df = pd.DataFrame()
      ...: j = 0
      ...: foo = pd.read_csv('foo.txt',sep=' *',names=list('abcdef'))
      ...: for i, row in foo.ix[1:].iterrows():
      ...:     if row[0][0] == '#':
      ...:         df_list.append(df)
      ...:         df = pd.DataFrame()
      ...:     else:
      ...:         df = df.append(row)
      ...: df_list.append(df)

In [1436]: df_list[0]
Out[1436]: 
           a      b      c     d              e    f
1  21101400B     86    12B   110            325   25
2   10100000   200B     6B   110            325   77
3         20  95300  -9999  -27B  100-9999-9999  NaN
4         10  92500   820B  -39B             90  290

In [1437]: df_list[1]
Out[1437]: 
           a      b      c     d              e    f
6  21101400B     86    14B   110            325   25
7   10100000   200B     2B   110            325   77
8         20  95300  -9999  -85B  100-9999-9999  NaN
9         10  92500   820B  -25B             90  290

答案 1 :(得分:0)

这个答案是基于每个'框架'包含相同行数

的假设

首先我们用pandas read_csv()读取文件。我们利用comment参数省略每个标题并只读入数据

df = pd.read_csv('data.txt', comment='#', delim_whitespace=True, header=None)
df

    0           1   2   3   4   5
0   21101400B   86  12B 110 325 25
1   10100000    200B    6B  110 325 77
2   20  95300   -9999   -27B    100-9999-9999   NaN
3   10  92500   820B    -39B    90  290
4   21101400B   86  14B 110 325 25
5   10100000    200B    2B  110 325 77
6   20  95300   -9999   -85B    100-9999-9999   NaN
7   10  92500   820B    -25B    90  290

然后使用for循环解析并将每个帧存储在列表中。我假设行数= 4

frames = []
for begin in range(0,len(df),4): 
    frames.append(df[begin:begin+4])
frames[0]

    0           1   2   3   4   5
0   21101400B   86  12B 110 325 25
1   10100000    200B    6B  110 325 77
2   20  95300   -9999   -27B    100-9999-9999   NaN
3   10  92500   820B    -39B    90  290