如何Pandas read_csv每行多个记录

时间:2016-05-03 01:51:04

标签: python pandas dataframe iterator

(我是一只熊猫n00b)我有一些奇怪格式化的CSV数据,类似于:

i   A           B           C       
    x   y   z   x   y   z   x   y   z
-------------------------------------
1   1   2   3   4   5   6   7   8   9
2   1   2   3   3   2   1   2   1   3
3   9   8   7   6   5   4   3   2   1

其中ABC是分类,并且每个属性都有xyz。我想做的我想要做的事情(更大的split-apply-combine步骤的一部分)是用Pandas读取数据,这样我就可以像这样进行尺寸同质的观察:< / p>

i   id  GRP   x   y   z
-----------------------
1   1   A     1   2   3
2   1   B     4   5   6
3   1   C     7   8   9
4   2   A     1   2   3
5   2   B     3   2   1
6   2   C     2   1   3
7   3   A     9   8   7
8   3   B     6   5   4
9   3   C     3   2   1

那么最好如何实现这一目标?

#1 :我考虑过使用基本read_csv()选项读取文件,然后迭代/切片/转置/以创建另一个数据框我想要的结构。但就我而言,类别(ABC)和属性(xyz)的数量很大未提前知道。如果扩展到大型数据集,我也担心内存问题。

#2 :我喜欢在iterator中设置read_csv()参数然后每行产生多个观察结果的想法。 (没有设置chunksize=1的任何原因?)我不会以这种方式创建多个数据帧。

更聪明的方法是什么?

1 个答案:

答案 0 :(得分:1)

首先,我构建了与您类似的示例数据框:

column = pd.MultiIndex(levels=[['A', 'B', 'C'], ['x', 'y', 'z']],
                       labels=[[i for i in range(3) for _ in range(3)], [0, 1, 2]*3])

df = pd.DataFrame(np.random.randint(1,10, size=(3, 9)),
                  columns=column, index=[1, 2, 3])

print df

#    A        B        C      
#    x  y  z  x  y  z  x  y  z
# 1  5  7  4  7  7  8  9  1  9
# 2  8  5  1  8  5  9  4  4  2
# 3  4  9  6  2  1  4  6  1  6

要获得所需的输出,请使用df.stack()重新整形数据框,然后重置索引:

df = df.stack(0).reset_index()

df.index += 1    # to make index begin from 1

print df

#    level_0 level_1  x  y  z
# 1        1       A  5  7  4
# 2        1       B  7  7  8
# 3        1       C  9  1  9
# 4        2       A  8  5  1
# 5        2       B  8  5  9
# 6        2       C  4  4  2
# 7        3       A  4  9  6
# 8        3       B  2  1  4
# 9        3       C  6  1  6

然后您可以根据需要重命名列。希望它有所帮助。