首页 > 解决方案 > 将所有包含列表的列展开为自己的列

问题描述

给定以下数据框:

    FrameLen FrameCapLen  IPHdrLen  ... TLSRecordLen  TLSAppData PacketTime
0  [117, 66]   [117, 66]  [20, 20]  ...  [46.0, nan]  [nan, nan]   0.000045
1  [117, 66]   [117, 66]  [20, 20]  ...  [46.0, nan]  [nan, nan]   0.000024
2  [117, 66]   [117, 66]  [20, 20]  ...  [46.0, nan]  [nan, nan]   0.000027
3  [117, 66]   [117, 66]  [20, 20]  ...  [46.0, nan]  [nan, nan]   0.000024
4  [117, 66]   [117, 66]  [20, 20]  ...  [46.0, nan]  [nan, nan]   0.000011

如何将包含列表的每一列扩展为相应的新列,这样FrameLen就变成了FrameLen_1, FrameLen_2, ...,等等?

我知道这可以手动为每一列手动完成(见下文),但如何自动完成?

手动操作示例(看起来效率低下?):

tags = df['FrameLen'].apply(pd.Series)
tags = column.rename(columns = lambda x : 'FrameLen_' + str(x))
pd.concat([df[:], tags[:]], axis=1)
del df['FrameLen']

标签: pythonpandasdataframe

解决方案


您可以使用for循环df.add_prefix来附加列名:

以下面的df为例:

In [93]: In [55]: df = pd.DataFrame({'FrameLen':[[117, 66], [117, 66], [117, 66]], 'FrameCapLen':[[117, 66],[117, 66],[117, 66]], 'IPHdrLen':[[20, 20],[20, 20],[20, 20]], 'PacketTime':[0.000045, 0.000024,
    ...:  0.000027]})    

In [94]: df 
Out[94]: 
    FrameLen FrameCapLen  IPHdrLen  PacketTime
0  [117, 66]   [117, 66]  [20, 20]    0.000045
1  [117, 66]   [117, 66]  [20, 20]    0.000024
2  [117, 66]   [117, 66]  [20, 20]    0.000027

In [90]: d = pd.DataFrame() ## empty dataframe

In [91]: for i,j in df.items(): 
    ...:     if df['{}'.format(i)].dtype == 'object': 
    ...:         temp = pd.DataFrame(df[i].values.tolist()).add_prefix('{}_'.format(i)) 
    ...:         d = pd.concat([d,temp], axis=1) 
    ...:     else: 
    ...:         d = pd.concat([d, df[i]], axis=1) 
    ...:   

In [92]: d 
Out[92]: 
   FrameLen_0  FrameLen_1  FrameCapLen_0  FrameCapLen_1  IPHdrLen_0  IPHdrLen_1  PacketTime
0         117          66            117             66          20          20    0.000045
1         117          66            117             66          20          20    0.000024
2         117          66            117             66          20          20    0.000027

推荐阅读