我有一个系列,其中包含两个数组的笛卡尔积和相应的标签:
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循环?效率是一个重要的数据集......
答案 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