How to unnest (explode) a column in a pandas DataFrame?
我相信这个问题不是上面列出的问题的重复。我试图找到一列中单元格的组合,并以此创建两个列。上面的说明显示了如何取消嵌套列表,但找不到该列表的组合...
我有一个数据框,其中的一列包含一个列表。我正在尝试扩展此数据框,以便我可以获取列表的每个组合,并仍然保留其他信息。难以解释的示例数据帧如下:
name number ID code
1111 2 3 ['%AB','$12','&FD']
我试图弄清楚如何将此数据框转换为以下内容:
name number ID to from
1111 2 3 %AB $12
1111 2 3 %AB &FD
1111 2 3 $12 &FD
我尝试过的代码:
a = [y for x in df[['code']].stack() for y in combinations(x,2)]
df[['to','from']] = a
答案 0 :(得分:4)
想法是为新DataFrame中的索引添加元组索引(DataFrame.pop
是提取列),因此可能是DataFrame.join
原始的DataFrame
:
#if not default indices, create them
#df = df.reset_index(drop=True)
print (df)
name number ID code
0 1111 2 3 ['%AB','$12','&FD']
1 1000 2 3 ['%AB1','$121','&FD1']
a = [(i,) + y for i, x in df.pop('code').items() for y in combinations(x,2)]
df1 = pd.DataFrame(a, columns=['idx','to','to']).set_index('idx')
print (df1)
to to
idx
0 %AB $12
0 %AB &FD
0 $12 &FD
1 %AB1 $121
1 %AB1 &FD1
1 $121 &FD1
df2 = df1.join(df).reset_index(drop=True)
print (df2)
to to name number ID
0 %AB $12 1111 2 3
1 %AB &FD 1111 2 3
2 $12 &FD 1111 2 3
3 %AB1 $121 1000 2 3
4 %AB1 &FD1 1000 2 3
5 $121 &FD1 1000 2 3