Развернуть все столбцы со списками в собственные столбцы - PullRequest
0 голосов
/ 13 июля 2020

Учитывая следующий фрейм данных:

    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, ..., et c.?

Я знаю, что это можно сделать вручную для каждого столбца вручную (см. Ниже), но как это можно сделать автоматически?

Пример ручного управления (который выглядит неэффективным?):

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

Ответы [ 2 ]

2 голосов
/ 13 июля 2020

Вы можете использовать for l oop с 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
0 голосов
/ 13 июля 2020

Было бы излишним перебирать столбцы, но простой подход заключался бы в объединении разделенных столбцов и обновлении их новыми

import pandas as pd
import numpy as np
import io

data = '''
,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
'''

df = pd.read_csv(io.StringIO(data), sep=',', index_col=0)
# new columns create
c1 = df['FrameLen'].str.replace(r'^\[|\]$','').str.split(',', expand=True)
c2 = df['FrameCapLen'].str.replace(r'^\[|\]$','').str.split(',', expand=True)
c3 = df['IPHdrLen'].str.replace(r'^\[|\]$','').str.split(',', expand=True)
c4 = df['TLSRecordLen'].str.replace(r'^\[|\]$','').str.split(',', expand=True)
c5 = df['TLSAppData'].str.replace(r'^\[|\]$','').str.split(',', expand=True)
# new columns name create
new_col = [['{}_0'.format(col),'{}_1'.format(col)] for col in df.columns[:5]]
new_col = sum(new_col,[])
new_col.append('PacketTime')
# concat()
df_all = pd.concat([c1,c2,c3,c4,c5,df[['PacketTime']]], axis=1)
df_all.columns = new_col

df_all
|    |   FrameLen_0 |   FrameLen_1 |   FrameCapLen_0 |   FrameCapLen_1 |   IPHdrLen_0 |   IPHdrLen_1 |   TLSRecordLen_0 | TLSRecordLen_1   |   TLSAppData_0 | TLSAppData_1   |   PacketTime |
|---:|-------------:|-------------:|----------------:|----------------:|-------------:|-------------:|-----------------:|:-----------------|---------------:|:---------------|-------------:|
|  0 |          117 |           66 |             117 |              66 |           20 |           20 |               46 | nan              |            nan | nan            |      4.5e-05 |
|  1 |          117 |           66 |             117 |              66 |           20 |           20 |               46 | nan              |            nan | nan            |      2.4e-05 |
|  2 |          117 |           66 |             117 |              66 |           20 |           20 |               46 | nan              |            nan | nan            |      2.7e-05 |
|  3 |          117 |           66 |             117 |              66 |           20 |           20 |               46 | nan              |            nan | nan            |      2.4e-05 |
|  4 |          117 |           66 |             117 |              66 |           20 |           20 |               46 | nan              |            nan | nan            |      1.1e-05 |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...