展开组合的列表列并保留其他数据

时间:2019-05-24 11:53:51

标签: python pandas

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

1 个答案:

答案 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