在Pandas中定义和堆叠列(Python 3.4)

时间:2014-08-21 20:39:30

标签: python excel pandas csv dataframe

我正在尝试根据空格分隔/解析列的单元格中的短语。我在Python 3.4中使用Panda模块。所以我想要做的一个例子就是这样:

Keyword         Number    Row
Bob Jim Jon      300      2

进入这个:

Keyword        Number     Row
Bob            300        2
Jim            300        2
Jon            300        2

我一直在研究如何在整个论坛中这样做,并偶然发现了这个非常相似的问题(并且不让我直接评论它来问这个问题): pandas: How do I split text in a column into multiple rows?

根据该帖子调整答案我创建了这段代码:

import pandas as pd
xl = pd.ExcelFile("C:/Users/j/Desktop/helloworld.xlsx")
df = xl.parse("HelloWorld")
df.head()
df1 = df[['Keyword','Number','Row']]
s = df1['Keyword'].str.split(' ').apply(Series, 1).stack()
s.index = s.index.droplevel(-1)
s.name = 'Keyword'
del df1['Keyword']
y = df1.join(s)
print(y)

然而,当我尝试这个时,我收到以下错误

s = df['Keyword'].str.split(' ').apply(Series, 1).stack()
NameError: name 'Series' is not defined 

关于我做错了什么的任何建议?谢谢!

1 个答案:

答案 0 :(得分:0)

您可以使用apply(pd.Series),但是这样做效率不高。将np.repeat + itertools.chain馈送到pd.DataFrame构造函数将提供更好的性能:

import numpy as np
from itertools import chain

df = pd.DataFrame([['Bob Jim Jon', 300, 2]],
                  columns=['Keyword', 'Number', 'Row'])

split = df['Keyword'].str.split()
n = split.map(len)

res = pd.DataFrame({'Keyword': list(chain.from_iterable(split)),
                    'Number': np.repeat(df['Number'], n),
                    'Row': np.repeat(df['Row'], n)})

print(res)

  Keyword  Number  Row
0     Bob     300    2
0     Jim     300    2
0     Jon     300    2