我确信在不诉诸嵌套循环的情况下必须要做到这一点。
我有一个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
答案 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