2

我想采用具有单级索引的 Pandas 系列并将该索引拆分为具有多列的数据框。例如,对于输入:

s = pd.Series(range(10,17), index=['a','a','b','b','c','c','c'])

s
a    10
a    11
b    12
b    13
c    14
c    15
c    16
dtype: int64

我想要的输出是:

    a    b    c
0   10   12   14
1   11   13   15
2   NaN  NaN  16

我不能直接使用 unstack 命令,因为它需要一个多索引,而我只有一个单级索引。我尝试输入一个具有相同值的虚拟索引,但出现错误“ReshapeError:索引包含重复条目,无法重塑”。

我知道这有点不寻常,因为 1)pandas 不喜欢参差不齐的数组,所以需要填充,2)索引需要任意重置,3)我不能真正“初始化”数据帧直到我知道最长的一列会有多长时间。但这似乎仍然是我应该能够以某种方式做到的事情。我也考虑过通过 groupby 来做,但似乎没有任何像 grouped_df.values() 这样没有任何聚合函数的东西——可能是出于上述原因。

4

2 回答 2

2

您可以使用groupby, apply,reset_index创建多索引系列,然后调用unstack

import pandas as pd
s = pd.Series(range(10,17), index=['a','a','b','b','c','c','c'])
df = s.groupby(level=0).apply(pd.Series.reset_index, drop=True).unstack(0)
print df

输出:

   a   b   c
0  10  12  14
1  11  13  15
2 NaN NaN  16
于 2013-07-03T01:53:00.047 回答
0

Not sure how generalizable this is. I call this the groupby via concat pattern. Essentially an apply, but with control over how exactly its combined.

In [24]: s = pd.Series(range(10,17), index=['a','a','b','b','c','c','c'])

In [25]: df = DataFrame(dict(key = s.index, value = s.values))

In [26]: df
Out[26]: 
  key  value
0   a     10
1   a     11
2   b     12
3   b     13
4   c     14
5   c     15
6   c     16

In [27]: concat(dict([ (g,Series(grp['value'].values)) for g, grp in df.groupby('key') ]),axis=1)
Out[27]: 
    a   b   c
0  10  12  14
1  11  13  15
2 NaN NaN  16
于 2013-07-02T21:01:02.947 回答