将包含序列的所有列转换为更多列

2024-09-29 17:22:53 发布

您现在位置:Python中文网/ 问答频道 /正文

给定一个数据帧:

FrameLen    FrameCapLen      IPHdrLen          IPLen  ...     Loss_25     Loss_50          Interval PacketTime
0      [118.0, 66.0]  [118.0, 66.0]  [20.0, 20.0]  [104.0, 52.0]  ...  [0.0, 0.0]  [0.0, 0.0]    [918.0, 918.0]   0.000031
1      [120.0, 66.0]  [120.0, 66.0]  [20.0, 20.0]  [106.0, 52.0]  ...  [0.0, 0.0]  [0.0, 0.0]  [3527.0, 3527.0]   0.000011
2      [117.0, 66.0]  [117.0, 66.0]  [20.0, 20.0]  [103.0, 52.0]  ...  [0.0, 0.0]  [0.0, 0.0]  [1256.0, 1256.0]   0.000016
3      [118.0, 66.0]  [118.0, 66.0]  [20.0, 20.0]  [104.0, 52.0]  ...  [0.0, 0.0]  [0.0, 0.0]    [652.0, 652.0]   0.000017
4      [119.0, 66.0]  [119.0, 66.0]  [20.0, 20.0]  [105.0, 52.0]  ...  [0.0, 0.0]  [0.0, 0.0]      [44.0, 44.0]   0.000032
...              ...            ...           ...            ...  ...         ...         ...               ...        ...
83287  [117.0, 66.0]  [117.0, 66.0]  [20.0, 20.0]  [103.0, 52.0]  ...  [0.0, 0.0]  [0.0, 0.0]    [472.0, 472.0]   0.000024

包含列表的所有列都具有以下类型:

<class 'pandas.core.series.Series'>
0        [118.0, 66.0]
1        [120.0, 66.0]
2        [117.0, 66.0]
3        [118.0, 66.0]
4        [119.0, 66.0]
             ...
83287    [117.0, 66.0]
83288    [120.0, 66.0]
83289    [117.0, 66.0]
83290    [116.0, 66.0]
83291    [122.0, 66.0]

如何为包含序列的每列展开这些序列,以使结果为:

FrameLen_1   FrameLen_2   FrameCapLen_1, ..., ...
118.0        66.0         118.0

如果能够做到这一点,那就太好了,前提是人们可能不知道有多少列包含一个序列


Tags: 数据core类型pandas列表序列classseries
1条回答
网友
1楼 · 发布于 2024-09-29 17:22:53

stack/str/concat

stacked = df.stack().str
pd.concat([stacked[0], stacked[1]], axis=1) \
  .unstack().swaplevel(1, 0, 1).sort_index(axis=1)

  FrameLen     IPLen    
         0   1     0   1
0      118  66   104  52
1      120  66   106  52

您可以传递dict而不是list

stacked = df.stack().str
pd.concat({'1': stacked[0], '2': stacked[1]}, axis=1) \
  .unstack().swaplevel(1, 0, 1).sort_index(axis=1)

  FrameLen     IPLen    
         1   2     1   2
0      118  66   104  52
1      120  66   106  52

理解力

dat = [
    {f'{c}_{i}': x
     for c, X in zip(df, tup)
     for i, x in enumerate(X)}
    for tup in zip(*map(df.get, df))
]

pd.DataFrame(dat)

   FrameLen_0  FrameLen_1  IPLen_0  IPLen_1
0         118          66      104       52
1         120          66      106       52

您可以将初始值传递给enumerate

dat = [
    {f'{c}_{i}': x
     for c, X in zip(df, tup)
     for i, x in enumerate(X, 1)}
    for tup in zip(*map(df.get, df))
]

pd.DataFrame(dat)

   FrameLen_1  FrameLen_2  IPLen_1  IPLen_2
0         118          66      104       52
1         120          66      106       52

设置

df = pd.DataFrame({
    'FrameLen': [[118, 66], [120, 66]],
    'IPLen': [[104, 52], [106, 52]]
})

相关问题 更多 >

    热门问题