2013-12-17 70 views
3

我是新来的大熊猫所以道歉,因为我觉得是一个微不足道的问题,但我不能完全找到此相关的功能:大熊猫:转换CSV串联成一个数据帧

我已经得到一个由12个不同的数据序列组成的文件,每个序列的第n个元素组合在一起;即

series_A_data0 
series_B_data0 
series_C_data0 
... 
series_L_data0 
series_A_data1 
series_B_data1 
series_C_data1 
... 

我可以导入到这个大熊猫为一列的数据帧,但我怎样才能得到它变成一个12列数据系列?

仅供参考,我目前在做:

data = pd.read_csv(file) 
data.head(14) 

0 17655029760 
1 1529585664 
2 1598763008 
3 4936196096 
4 2192232448 
5 2119827456 
6 2143997952 
7 1549099008 
8 1593683968 
9 1361498112 
10 1514512384 
11 1346588672 
12 17939451904 
13 1544957952 

回答

2

你知道,该系列将始终可以以相同的顺序?如果是这样,我会创建一个MultiIndex,并从中取消。就像你所做的那样,在Series中阅读。我会用这个数据帧的工作:

In [31]: df = pd.DataFrame(np.random.randn(24)) 

In [32]: df 
Out[32]: 
      0 
0 -1.642765 
1 1.369409 
2 -0.732588 
3 0.357242 
4 -1.259126 
5 0.851803 
6 -1.582394 
7 -0.508507 
8 0.123032 
9 0.421857 
10 -0.524147 
11 0.381085 
12 1.286025 
13 -0.983004 
14 0.813764 
15 -0.203370 
16 -1.107230 
17 1.855278 
18 -2.041401 
19 1.352107 
20 -1.630252 
21 -0.326678 
22 -0.080991 
23 0.438606 

In [33]: import itertools as it 

In [34]: series_id = it.cycle(list('abcdefghijkl')) # first 12 letters. 

In [60]: idx = pd.MultiIndex.from_tuples(zip(series_id, df.index.repeat(12)[:len(df)])) 

我们需要重复的索引,使每个系列的第一个观察是在指数0。现在设置为索引和unstack

In [61]: df.index = idx 

In [62]: df 
Out[62]: 
      0 
a 0 -1.642765 
b 0 1.369409 
c 0 -0.732588 
d 0 0.357242 
e 0 -1.259126 
f 0 0.851803 
g 0 -1.582394 
h 0 -0.508507 
i 0 0.123032 
j 0 0.421857 
k 0 -0.524147 
l 0 0.381085 
a 1 1.286025 
b 1 -0.983004 
c 1 0.813764 
d 1 -0.203370 
e 1 -1.107230 
f 1 1.855278 
g 1 -2.041401 
h 1 1.352107 
i 1 -1.630252 
j 1 -0.326678 
k 1 -0.080991 
l 1 0.438606 

[24 rows x 1 columns] 

In [74]: df.unstack(0)[0] 
Out[74]: 
      a   b   c   d   e   f   g \ 
0 -1.642765 1.369409 -0.732588 0.357242 -1.259126 0.851803 -1.582394 
1 1.286025 -0.983004 0.813764 -0.203370 -1.107230 1.855278 -2.041401 

      h   i   j   k   l 
0 -0.508507 0.123032 0.421857 -0.524147 0.381085 
1 1.352107 -1.630252 -0.326678 -0.080991 0.438606 

[2 rows x 12 columns] 

unstack(0)表示将外部索引标签移动到列。

+0

啊,你是1分钟更快:-)。是的,这是另一种选择:'与多指数'或'pivotack'与系列 – joris

+0

'unstack'两个很好的答案! – TomAugspurger

+0

太好了 - 谢谢。我最终接受了这个答案,因为我事先并不知道我有多少行(尽管我可以单独计算它,所以'cycle()'的技巧非常有用。 – DaveR

2

我不知道是否有一个更简单的方法,但如果你能构建一个可比的一系列所需的列名和索引值,可以使用pd.pivot

假设你有3次的12个值,创建一个虚拟例如:

data = pd.Series(np.random.randn(12*3)) 

现在,您可以构建所需的列和指标如下:

col = pd.Series(np.tile(list('ABCDEFGHIJKL'),3)) 
idx = pd.Series(np.repeat(np.arange(3), 12)) 

现在:

In [18]: pd.pivot(index=idx, columns=col, values=data.values) 
Out[18]: 
      A   B   C   D   E   F   G \ 
0 1.296702 0.270532 -0.645502 0.213300 -0.224421 -0.634656 -2.362567 
1 -1.986403 1.006665 -1.167412 -0.697443 -1.394925 -0.365205 -1.468349 
2 0.689492 -0.410681 0.378916 1.552068 0.144651 -0.419082 -0.433970 

      H   I   J   K   L 
0 2.102229 0.538711 -0.839540 -0.066535 1.154742 
1 -1.090374 -1.344588 0.515923 -0.050190 -0.163259 
2 -0.235364 0.296751 0.456884 0.237697 1.089476 

PS:对于只使用data代替data.values不工作的一些原因。


您还可以使用unstack做得一样@TomAugspurger解释:

midx = pd.MultiIndex.from_tuples(zip(idx, col)) 
data.index = midx 
data.unstack()