系列包含笛卡尔积

时间:2015-10-01 17:40:24

标签: python pandas

我有一个系列,其中包含两个数组的笛卡尔积和相应的标签:

  idx1=array(['2m_1y', '6m_1y', '1y_1y', '3y_1y', '5y_1y', '15y_1y', '2m_2y',
       '6m_2y', '1y_2y', '3y_2y', '5y_2y', '15y_2y', '2m_5y', '6m_5y',
       '1y_5y', '3y_5y', '5y_5y', '15y_5y', '2m_10y', '6m_10y', '1y_10y',
       '3y_10y', '5y_10y', '15y_10y'], dtype=object)

和值:

vals1 = np.random.rand(24,)

有没有办法将其转换为数据框,索引为每个标签的第一部分(2m,6m,1y,3y ......),列名称为第二部分(1y,2y,5y ......)使用for循环?效率是一个重要的数据集......

1 个答案:

答案 0 :(得分:1)

您可以使用str.split然后pivot

执行此类操作
>>> idx1 = np.array(['2m_1y', '6m_1y', '1y_1y', '3y_1y', '5y_1y', '15y_1y', '2m_2y',
       '6m_2y', '1y_2y', '3y_2y', '5y_2y', '15y_2y', '2m_5y', '6m_5y',
       '1y_5y', '3y_5y', '5y_5y', '15y_5y', '2m_10y', '6m_10y', '1y_10y',
       '3y_10y', '5y_10y', '15y_10y'], dtype=object)
>>> vals1 = np.arange(len(idx1))
>>> df = pd.Series(idx1).str.split("_", expand=True)
>>> df[2] = vals1
>>> df.pivot(index=0, columns=1, values=2)
1    10y  1y  2y  5y
0                   
15y   23   5  11  17
1y    20   2   8  14
2m    18   0   6  12
3y    21   3   9  15
5y    22   4  10  16
6m    19   1   7  13

在此之后,您可以根据需要对列和索引进行排序,以便更方便地订购它们。

在这里,expand=True让我们直接从组件中获取列(与过去不同,当我们不得不使用丑陋的黑客时):

>>> pd.Series(idx1).str.split("_").head()
0    [2m, 1y]
1    [6m, 1y]
2    [1y, 1y]
3    [3y, 1y]
4    [5y, 1y]
dtype: object
>>> pd.Series(idx1).str.split("_", expand=True).head()
    0   1
0  2m  1y
1  6m  1y
2  1y  1y
3  3y  1y
4  5y  1y