使用str.split(panda)拆分一列时强制列数

时间:2018-06-28 19:25:19

标签: python python-3.x pandas

我不知道该过程是否可以通过str.split来实现。但是例如,我在数据框df中有以下列:

   Column
0 a-b-c-d-e-f-g-h-i-j
1 a-a-b-b-c-c
2 a-a-b-b

我知道,如果我这样做

df['Column'].str.split('-', expand=True)

然后我将得到如下结果:

  0  1  2  3  4      5      6      7      8      9
0 a  b  c  d  e      f      g      h      i      j
1 a  a  b  b  c      c    None   None   None   None
2 a  a  b  b  None  None  None   None   None   None

根据拆分时的最大元素数创建许多列。

我想知道是否有可能总是有10列而不管元素的数量如何,只要它在0到10之间,并像下面这样用'None'填充其余的列即可。

因此,这将引起以下专栏:

       Column
0 a-b-c-d-e-f-g-h
1 a-a-b-b-c-c
2 a-a-b-b

进入:

  0  1  2  3  4      5      6      7      8      9
0 a  b  c  d  e      f      g      h    None   None
1 a  a  b  b  c      c    None   None   None   None
2 a  a  b  b  None  None  None   None   None   None

2 个答案:

答案 0 :(得分:5)

之后

reindex
通过 user3483203

的改进实现
df.Column.str.split('-', expand=True).reindex(columns=range(10))

   0  1  2  3     4     5     6     7     8     9
0  a  b  c  d     e     f     g     h     i     j
1  a  a  b  b     c     c  None  None  None  None
2  a  a  b  b  None  None  None  None  None  None

一种理解方法

pd.DataFrame([
    (lambda l: l + [None] * (10 - len(l)))(x.split('-'))
    for x in df.Column
], df.index)

   0  1  2  3     4     5     6     7     8     9
0  a  b  c  d     e     f     g     h  None  None
1  a  a  b  b     c     c  None  None  None  None
2  a  a  b  b  None  None  None  None  None  None

答案 1 :(得分:1)

您可以在下面使用:

pd.concat([pd.DataFrame([np.nan]*10).T, pd.DataFrame(df['Column'].str.split('-').tolist())], ignore_index=True).iloc[1:]

输出:

   0  1  2  3     4     5     6     7   8   9
1  a  b  c  d     e     f     g     h NaN NaN
2  a  a  b  b     c     c   NaN   NaN NaN NaN
3  a  a  b  b   NaN   NaN   NaN   NaN NaN NaN