背景
下面的代码是从这里修改的 Efficient way to unnest (explode) multiple list columns in a pandas DataFrame
我创建一个数据框
import pandas as pd
df = pd.DataFrame({'App': ['x1','x2','x3', 'x4'], 'Ban':['v1','v2','v3','v4'], 'C':[['c2'],['c3','c4'],['c5','c6'],['c7','c8']],'D':[['d1','d2'],['d3','d4'],['d5','d6'],['d7','d8']], 'E':[['e1','e2'],['e3','e4'],['e5','e6'],['e7','e8']]})
df
如下所示
App Ban C D E
0 x1 v1 [c2] [d1, d2] [e1, e2]
1 x2 v2 [c3, c4] [d3, d4] [e3, e4]
2 x3 v3 [c5, c6] [d5, d6] [e5, e6]
3 x4 v4 [c7, c8] [d7, d8] [e7, e8]
然后我使用以下代码
(df.set_index('Ban')
.apply(lambda x: x.apply(pd.Series).stack())
.reset_index()
.drop('level_1', 1))
哪个创建以下内容
Ban App C D E
0 v1 x1 c2 d1 e1
1 v1 NaN NaN d2 e2
2 v2 x2 c3 d3 e3
3 v2 NaN c4 d4 e4
4 v3 x3 c5 d5 e5
5 v3 NaN c6 d6 e6
6 v4 x4 c7 d7 e7
7 v4 NaN c8 d8 e8
所需的输出
这接近我想要的。但是我想要的输出是这个(没有NaN
,而是具有适当的App
和C
名称:
Ban App C D E
0 v1 x1 c2 d1 e1
1 v1 x1 c2 d2 e2
2 v2 x2 c3 d3 e3
3 v2 x2 c4 d4 e4
4 v3 x3 c5 d5 e5
5 v3 x3 c6 d6 e6
6 v4 x4 c7 d7 e7
7 v4 x4 c8 d8 e8
问题
如何获得所需的输出?
答案 0 :(得分:0)
只需添加ffill
来修正输出
df.set_index('Ban').apply(lambda x: x.apply(pd.Series).stack()).groupby(level=0).ffill().reset_index(drop=True)
Out[794]:
Ban App C D E
0 v1 x1 c2 d1 e1
1 v1 x1 c2 d2 e2
2 v2 x2 c3 d3 e3
3 v2 x2 c4 d4 e4
4 v3 x3 c5 d5 e5
5 v3 x3 c6 d6 e6
6 v4 x4 c7 d7 e7
7 v4 x4 c8 d8 e8