将Pandas列拆分为多个列

时间:2017-06-14 00:31:52

标签: python pandas

Pandas有没有办法将列拆分成多列? 我在数据框中有一列,其内容如下:

a
[c,a]
b

我想把它分成:

colA colB colC
a    nan  nan
a    nan   c
a     b   nan

请注意原始列第2行中变量的顺序。 感谢

3 个答案:

答案 0 :(得分:1)

考虑系列s

s = pd.Series(['a', ['c', 'a'], 'b'])

s

0         a
1    [c, a]
2         b
dtype: object

使用pd.Series'|'.join神奇地变成连接管道分隔的字符串。使用str.get_dummies获取0和1的数组。乘以列,用列值替换。 where屏蔽零并替换为np.NaN

d1 = s.apply(lambda x: '|'.join(pd.Series(x))).str.get_dummies()
d1.mul(d1.columns.values).where(d1.astype(bool))

     a    b    c
0    a  NaN  NaN
1    a  NaN    c
2  NaN    b  NaN

PROJECT / KILL

import itertools

n = len(s)
i = np.arange(n).repeat([len(x) if hasattr(x, '__len__') else 1 for x in s])
j, u = pd.factorize(list(itertools.chain(*s)))
m = u.size
b = np.bincount(i * m + j, minlength=n * m).reshape(n, m)
pd.DataFrame(np.where(b, u, np.NaN), columns=u)

     a    b    c
0    a  NaN  NaN
1    a  NaN    c
2  NaN    b  NaN

计时

%%timeit
d1 = s.apply(lambda x: '|'.join(pd.Series(x))).str.get_dummies()
d1.mul(d1.columns.values).where(d1.astype(bool))

100 loops, best of 3: 2.58 ms per loop

%%timeit
n = len(s)
i = np.arange(n).repeat([len(x) if hasattr(x, '__len__') else 1 for x in s])
j, u = pd.factorize(list(itertools.chain(*s)))
m = u.size
b = np.bincount(i * m + j, minlength=n * m).reshape(n, m)
pd.DataFrame(np.where(b, u, np.NaN), columns=u)

1000 loops, best of 3: 287 µs per loop

%%timeit
s.apply(pd.Series)\
  .stack().str.get_dummies().sum(level=0)\
  .pipe(lambda x: x.mul(x.columns.values))\
  .replace('',np.nan)\
  .add_prefix('col')

100 loops, best of 3: 4.24 ms per loop

答案 1 :(得分:0)

首先在col列中堆叠列表,为每个元素获取虚拟对象,然后将它们转换为a,b,c。最后重命名列。

df.col.apply(pd.Series)\
  .stack().str.get_dummies().sum(level=0)\
  .pipe(lambda x: x.mul(x.columns.values))\
  .replace('',np.nan)\
  .add_prefix('col')
Out[204]: 
  cola colb colc
0    a  NaN  NaN
1    a  NaN    c
2  NaN    b  NaN

答案 2 :(得分:0)

假设您将列作为一个名为s的系列列​​出。

s = pd.Series(['a', ['c', 'a'], 'b'])
pd.DataFrame({"col" + x.upper(): s.apply(lambda n: x if x in n else np.NaN)
              for x in ['a', 'b', 'c']})