Python - 将字符串拆分为多列

3
我有一个数据框,其中包含一个字符串列。它看起来像这样:
[a]
aaa aa a aaaa
bbb bbb b
cc cccc ccc cc ccc

我想要的是添加6个列,将[a]的值分割开来,就像这样:
[a]                     [a0]    [a1]    [a2]    [a3]    [a4]    [a5]
aaa aa a aaaa           aaa     aa      a       aaaa    NaN     NaN
bbb bbb b               bbb     bbb     b       NaN     NaN     NaN
cc cccc ccc cc ccc      cc      cccc    ccc     cc      ccc     NaN

我使用这段代码:
for i in range(6):
     df["a{}".format(i)] = df[a].apply(lambda x:x.split(' ')[i])

但是我遇到了“超出范围”的错误,这可以解释为所有值的元素数量不相同。
我该如何避免这个错误,并将所有出错的值替换为None?
提前感谢。
编辑:我们无法预先知道要拆分的字符串长度。有时它包含2个出现次数,有时包含4个等等。

你是否预先知道列数?如果不知道,那么扫描数据框一次来获取它是否代价高昂? - IanS
嗨,IanS。我们不确定,但我们猜测这个数字永远不会超过6列。 - Cascador84
2个回答

8
你可以使用str.split并提供expand=True,这样它就会扩展成每个单独拆分的数据帧。
通过提供一个额外的范围来重新索引它们,以便我们可以创建一个带有NaNs的额外列。稍后提供一个可选的前缀字符。
然后,按列连接原始和提取的DF's
str_df = df['a'].str.split(expand=True).reindex(columns=np.arange(6)).add_prefix('a')
pd.concat([df, str_df], axis=1).replace({None:np.NaN})

enter image description here


1
嗨,Nickil。再次感谢,它起作用了。 - Cascador84

2

您已经接近成功了 :) 您需要做的就是在当前lambda函数的末尾添加以下小条件:

if len(x.split(" "))>i else None

你的代码将变为:

您的代码变成:

for i in range(6):
     df["a{}".format(i)] = df[a].apply(lambda x: x.split(' ')[i] if len(x.split(' ')>i else None)

嗨mircealungu,如你所说,我快要完成了 :) 实际上,在你的代码(仍然存在超出范围错误)上,我最终改为:for i in range(6): df["a{}".format(i)] = df[a].apply(lambda x: x.split(' ')[i] if len(x.split(' '))>i else None).这样更简单,我喜欢 :) 谢谢。 BR - Cascador84

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