在list元素上扩展pandas数据框

时间:2019-04-30 17:04:30

标签: python pandas

我有一个数据框,其中的一列包含一个列表。我想分解这些列表,以便每个元素都有自己的行。

Ex df:

index    Name              Color
  1      Ford    ['Red,Blue' , 'Red,Blue']

结果df:

index    Name    Color
  1      Ford    Red
  2      Ford    Blue
  3      Ford    Red
  4      Ford    Blue

我尝试过的代码:

s = df['Color'].str.split(',').apply(Series,1).stack()
s.index = s.index.droplevel(-1)
s.name = 'Color'
del df['Color']
df = df.join(s)

2 个答案:

答案 0 :(得分:0)

弄清楚了,在下面回答:

s = df.apply(lambda x: pd.Series(x['Color']),axis=1).stack.reset_index(level=1, drop=True)
s.Name = 'Color'
df = df.drop('Color', axis=1).join(s)

s = df['Color'].str.split(',').apply(Series,1).stack()
s.index = s.index.droplevel(-1)
s.name = 'Color'
del df['Color']
df = df.join(s)

答案 1 :(得分:0)

在大数据集上使用apply确实很慢。我提出了不使用apply的解决方案,如下所示:set_indexindex列上的Name。接下来,在join上使用splitColor。最后,从颜色列表中创建新数据,然后从stackreset_indexdrop不需要的列中创建数据。

按如下方式使用df

In [2370]: df
Out[2370]:
   index   Name                       Color
0      1   Ford        [Red,Blue, Red,Blue]
1      1  Chevy  [Yellow,Blue, Yellow,Blue]
2      1  Tesla     [White,Green, Red,Blue]


df.set_index(['index', 'Name'], inplace=True)
color_list = [','.join(st).split(',') for st in df.Color.tolist()]
pd.DataFrame(color_list, index=df.index).stack().reset_index(level=[1, 2]).drop('level_2', 1)

Out[2376]:
        Name       0
index
1       Ford     Red
1       Ford    Blue
1       Ford     Red
1       Ford    Blue
1      Chevy  Yellow
1      Chevy    Blue
1      Chevy  Yellow
1      Chevy    Blue
1      Tesla   White
1      Tesla   Green
1      Tesla     Red
1      Tesla    Blue