2017-06-14 100 views
2

熊貓有沒有辦法將一列分成多列? 我有一個數據幀一列,其中內容如下:將熊貓分欄分成多列

a 
[c,a] 
b 

我想這個分成:

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

請注意變量的順序第2行中的原柱。 感謝

+2

爲什麼你在第三行有一個'a'? – DyZ

+0

@DYZ,感謝您指出第三行的'a'。這是一個錯誤;它不應該在那裏。 – bluetooth

回答

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可以獲得零和一個數組。乘以列乘以列值。 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 
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 
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']})