(我是一只熊猫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
其中A
,B
,C
是分类,并且每个属性都有x
,y
,z
。我想做的想我想要做的事情(更大的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()
选项读取文件,然后迭代/切片/转置/以创建另一个数据框我想要的结构。但就我而言,类别(A
,B
,C
)和属性(x
,y
,z
)的数量很大和未提前知道。如果扩展到大型数据集,我也担心内存问题。
#2 :我喜欢在iterator
中设置read_csv()
参数然后每行产生多个观察结果的想法。 (没有设置chunksize=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
然后您可以根据需要重命名列。希望它有所帮助。