按分隔符将 Pandas 系列拆分为数据帧

7
我正在尝试通过特定的分隔符 "; " 来拆分一个 pandasseries 对象。我想将它转换为一个 dataframe,并且总是会有相同数量的“列”,或者更确切地说,有相同数量的 "; " 表示列。我认为这样做就可以解决问题,但实际上并没有。我不想迭代,我相信 pandas 已经开发了更有效的快捷方式。python 如何将 pandas series 转换为 pandas DataFrame? 有人知道最有效的方法来通过 "; " 将此 series 拆分为 dataframe 吗?
#Example Data
SR_test = pd.Series(["a; b; c; d; e","aa; bb; cc; dd; ee","a1; b2; c3; d4; e5"])
# print(SR_test)
# 0         a; b; c; d; e
# 1    aa; bb; cc; dd; ee
# 2    a1; b2; c3; d4; e5

#Convert each row one at a time (not efficient)
tmp = []
for element in SR_test:
    tmp.append([e.strip() for e in element.split("; ")])
DF_split = pd.DataFrame(tmp)
# print(DF_split)
#     0   1   2   3   4
# 0   a   b   c   d   e
# 1  aa  bb  cc  dd  ee
# 2  a1  b2  c3  d4  e5

EdChum和Jezrael,谁先回答的?我想公平对待。这些都是很好的答案,正是我想要的。 - O.rka
我认为我是第一个,但差别只有大约15秒。所以我不知道它是否重要。@EdChum,你怎么看? - jezrael
2个回答

12
你可以使用 str.split:
df = SR_test.str.split('; ', expand=True)
print df

    0   1   2   3   4
0   a   b   c   d   e
1  aa  bb  cc  dd  ee
2  a1  b2  c3  d4  e5

另一种更快的解决方案,如果Series没有NaN值:

print pd.DataFrame([ x.split('; ') for x in SR_test.tolist() ])
    0   1   2   3   4
0   a   b   c   d   e
1  aa  bb  cc  dd  ee
2  a1  b2  c3  d4  e5

时间表:

SR_test = pd.concat([SR_test]*1000).reset_index(drop=True)

In [21]: %timeit SR_test.str.split('; ', expand=True)
10 loops, best of 3: 34.5 ms per loop

In [22]: %timeit pd.DataFrame([ x.split('; ') for x in SR_test.tolist() ])
100 loops, best of 3: 9.59 ms per loop

遍历循环更快吗? - O.rka
1
是的,如果使用这种方式。str.split 会稍微慢一些,因为它也可以很好地处理 NaN 值。 - jezrael

3
使用向量化的 str.split 函数,参数设为 expand=True,将其作为数据参数传递给 DataFrame 构造函数:
In [4]:
df = pd.DataFrame(SR_test.str.split(';',expand=True))
df

Out[4]:
    0    1    2    3    4
0   a    b    c    d    e
1  aa   bb   cc   dd   ee
2  a1   b2   c3   d4   e5

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接