将Dataframe列的内容“扩展”为新列

时间:2017-04-21 14:01:17

标签: python pandas dataframe

我确信在不诉诸嵌套循环的情况下必须要做到这一点。

我有一个df(注意有一个包含字符串列表的列)

df = DataFrame({'A' : [5,6,3,4], 'B' : [1,2,3,5], 'C' : [['a','b'],['b','c'] ,['g','h'],['x','y']]})

最终我想“扩展”列中列表中的值,以便每个可能的列表项都有一个列,如果出现该值,则每行在正确的列中都有1。 e.g。

df =

A  B      C      a  b  c  g  h  x  y
5  1  ['a','b']  1  1
6  2  ['b','c']     1  1
3  3  ['g','h']           1  1
4  5  ['x','y']                 1  1

1 个答案:

答案 0 :(得分:1)

您可以使用pandas.get_dummies,但groupby需要columns并汇总max

df1 = pd.get_dummies(pd.DataFrame(df.C.values.tolist()), prefix='', prefix_sep='')
        .groupby(axis=1, level=0).max()

df1 = pd.concat([df, df1], axis=1)
print (df1)

   A  B       C  a  b  c  g  h  x  y
0  5  1  [a, b]  1  1  0  0  0  0  0
1  6  2  [b, c]  0  1  1  0  0  0  0
2  3  3  [g, h]  0  0  0  1  1  0  0
3  4  5  [x, y]  0  0  0  0  0  1  1

replace + str.get_dummies的另一种解决方案:

df1 = df.C.astype(str).replace(['\[','\]', "'", "\s+"], '', regex=True).str.get_dummies(',')
df1 = pd.concat([df, df1], axis=1)
print (df1)

   A  B       C  a  b  c  g  h  x  y
0  5  1  [a, b]  1  1  0  0  0  0  0
1  6  2  [b, c]  0  1  1  0  0  0  0
2  3  3  [g, h]  0  0  0  1  1  0  0
3  4  5  [x, y]  0  0  0  0  0  1  1

也可以删除0,但是使用数字获取字符串值,并且可以破坏一些pandas函数:

df1 = df.C.astype(str).replace(['\[','\]', "'", "\s+"], '', regex=True).str.get_dummies(',')
df1 = df1.replace(0,'')
df1 = pd.concat([df, df1], axis=1)
print (df1)
   A  B       C  a  b  c  g  h  x  y
0  5  1  [a, b]  1  1               
1  6  2  [b, c]     1  1            
2  3  3  [g, h]           1  1      
3  4  5  [x, y]                 1  1