2013-03-13 98 views
1

我有一个熊猫DataFrame,其中包含一个管道分隔的字符串在其中一个字段中。我将它分成了一个apply内的列表,并将其添加到DataFrame中。管道分隔字符串中值的数量和内容各不相同。将尺寸添加到熊猫DataFrame

df = DataFrame([{'wibble': 'a', 'pipestring': 'aa|aaa|aaa'}, 
    {'wibble': 'b', 'pipestring': 'bb|bbbb|bbb|bbbbbb'}]) 

df['pipelist'] = df['pipestring'].map(lambda x: x.split('|')) 

我是很新,大熊猫所以可能是完全错误的这一点,但我认为这将通过与多个指数水平的数据帧进行更好的体现,所以我可以利用熊猫的索引和其他(精彩)工具。但我无法弄清楚如何做到这一点。任何指针/建议我应该做什么,而非常感激。

回答

2

更具体的是你的计算目标是什么?

这里有多达分割你的数据,并创建一个综合框架

In [44]: x = df['pipestring'].apply(lambda x: pd.Series(x.split('|'))) 

In [45]: x 
Out[45]: 
    0  1 2  3 
0 aa aaa aaa  NaN 
1 bb bbbb bbb bbbbbb 

In [46]: df.join(x).set_index(['wibble']) 
Out[46]: 
       pipestring     pipelist 0  1 2  3 
wibble                  
a    aa|aaa|aaa   [aa, aaa, aaa] aa aaa aaa  NaN 
b  bb|bbbb|bbb|bbbbbb [bb, bbbb, bbb, bbbbbb] bb bbbb bbb bbbbbb 
+0

谢谢 - 这正是我想要做的。我唯一的问题(再次请原谅我的无知)是我必须将系列丛书转换成列表,然后再返回到熊猫来格式化输出中的东西(否则我得到了一个DataFrame系列)'x = DataFrame(list(df ['pipestring'] .application(lambda x:pd.Series(x.split('|')))))'再次感谢! – meloncholy 2013-03-13 19:25:04

+0

这应该适用于0.10.1或> – Jeff 2013-03-13 20:19:22

+0

您是对的。我没有意识到,但我正在运行0.9.1。现在更新... – meloncholy 2013-03-13 20:45:34

0

最快的方式开始使用那就是stack您的数据帧:

In [44]: df = df.stack() 

In [45]: df.ix[0, 'pipelist'] 
Out[45]: ['aa', 'aaa', 'aaa'] 

In [46]: df 
Out[46]: 
0 pipestring     aa|aaa|aaa 
    wibble        a 
    pipelist    [aa, aaa, aaa] 
1 pipestring   bb|bbbb|bbb|bbbbbb 
    wibble        b 
    pipelist  [bb, bbbb, bbb, bbbbbb] 

这是否让你要呢?

+0

对不起的方式,我明明没有解释自己很清楚。我试图添加额外的列到我的DataFrame(由转换'pipestring'得到的列表确定),而不是重构DataFrame。 (基本上在@杰夫的答案。) – meloncholy 2013-03-13 19:28:53