pandas:将CSV系列转换为数据框

时间:2013-12-17 14:39:53

标签: python pandas

我是熊猫新手,对我认为是一个微不足道的问题表示道歉,但我找不到相关的功能:

我有一个文件,它基本上由12个不同的数据系列组成,每个系列的第n个元素组合在一起;即。

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

我可以将它作为单列数据框导入到pandas中,但是如何将其导入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 个答案:

答案 0 :(得分: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)表示将外部索引标签移动到列。

答案 1 :(得分:2)

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

假设您有12个值的3倍,创建一个虚拟示例:

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()