示例代码:
df=pd.DataFrame({'A':[1,2],'B':[[1,2],[1,2]]}) df Out[458]: A B 0 1 [1, 2] 1 2 [1, 2]
拆分成多行的效果:
A B 0 1 1 1 1 2 3 2 1 4 2 2
1、使用pandas.DataFrame.explode函数拆分成多行
从pandas 0.25开始,列表类型的列(Series)折分成多行,则可以使用以下pandas.DataFrame.explode
函数。
df = pd.DataFrame({'A': [1, 2, 3, 4],'B': [[1, 2], [1, 2], [], np.nan]}) df.B = df.B.fillna({i: [] for i in df.index}) # 替换 NaN 使用 [] df.explode('B')
A B
0 1 1
0 1 2
1 2 1
1 2 2
2 3 NaN
3 4 NaN
相关文档:Python pandas.DataFrame.explode函数方法的使用
2、使用apply和pd.Series拆分成多行
df = pd.DataFrame({'A': [1, 2, 3, 4],'B': [[1, 2], [1, 2], [], np.nan]})
df.set_index('A').B.apply(pd.Series).stack().reset_index(level=0).rename(columns={0:'B'})
Out[463]:
A B
0 1 1
1 1 2
0 2 1
1 2 2
注意:此方法易于理解,但不建议在数据量比较大或性能要求较高的情况使用。
3、使用numpy高性能实现
df = pd.DataFrame({'A': [1, 2, 3, 4],'B': [[1, 2], [1, 2], [], np.nan]})
newvalues=np.dstack((np.repeat(df.A.values,list(map(len,df.B.values))),np.concatenate(df.B.values)))
pd.DataFrame(data=newvalues[0],columns=df.columns)
A B
0 1 1
1 1 2
2 2 1
3 2 2