按列内容融化

时间:2019-05-06 07:32:40

标签: pandas

具有如下数据框:

df = pd.DataFrame({'Col1': ('x1', 'x2', 'x3'),
              'Col2': ('y1', 'y2', 'y3'),
              'Sets': ({1, 2}, {2, 3, 4}, {5})})

...

    Col1    Col2    Sets
0   x1      y1     {1, 2}
1   x2      y2     {2, 3, 4}
2   x3      y3     {5}

如何融合“设置”列以获得以下输出:

pd.DataFrame({'Col1': ('x1', 'x1', 'x2', 'x2', 'x2', 'x3'),
              'Col2': ('y1', 'y1', 'y2', 'y2', 'y2', 'y3'),
              'Col3': (1, 2, 2, 3, 4, 5)})

...

    Col1    Col2    Col3
0   x1      y1      1
1   x1      y1      2
2   x2      y2      2
3   x2      y2      3
4   x2      y2      4
5   x3      y3      5

...

尝试执行以下操作...

df = df.assign(lens=[len(r) for r in df.Sets]) # get length of each set
df.lens = df.lens.astype('int32') # repeat takes only int32!
df = df.reindex(df.index.repeat(df.lens)) # repeats the rows
df = df.assign(Lists=[list(r) for r in df.Sets]) # converts sets to list

df = df.assign(Loc=df.groupby(df.index).cumcount()) # the list index

...但是不知道如何使用 Loc ...

提取 List 的值

欢迎提供帮助。

1 个答案:

答案 0 :(得分:1)

通过重复的索引创建系列,因此可以使用DataFrame.join重复行:

s = (pd.DataFrame(df.pop('Sets').values.tolist(), index=df.index)
        .stack()
        .rename('Sets')
        .reset_index(level=1, drop=True))

df = df.join(s).reset_index(drop=True)
print (df)

  Col1 Col2  Sets
0   x1   y1   1.0
1   x1   y1   2.0
2   x2   y2   2.0
3   x2   y2   3.0
4   x2   y2   4.0
5   x3   y3   5.0