我有一个数据框,其中的一列包含一个列表。我想分解这些列表,以便每个元素都有自己的行。
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)
答案 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_index
和index
列上的Name
。接下来,在join
上使用split
和Color
。最后,从颜色列表中创建新数据,然后从stack
和reset_index
到drop
不需要的列中创建数据。
按如下方式使用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