猿问

如何根据包含的文本值将熊猫数据框列拆分为多列

假设有如下列。


df = pd.DataFrame(['A-line B-station 9-min C-station 3-min',

                   'D-line E-station 8-min F-line G-station 5-min',

                   'G-line H-station 1-min I-station 6-min J-station 8-min'],

                    columns=['station'])

A,B,C 只是任意字符,并且有很多这样的行。


                                             station

0             A-line B-station 9-min C-station 3-min

1      D-line E-station 8-min F-line G-station 5-min

2  G-line H-station 1-min I-station 6-min J-stati...

我们如何制作如下所示的列?


   Line1     Station1-1   Station1-2 Station1-3   Line2    Station2-1

0  A-line    B-station    C-station    null       null     null

1  D-line    E-station    null         null       F-line   G-station

2  G-line    H-station    I-station    J-station  null     null

stationX-X 表示Station(线路号)-(车站顺序)


Station1-1 表示第一行(line1)的第一站


Station1-2 表示第一行(line1)的第二站


Station2-1 表示二线(line2)的第一站


我试图按分隔符分割;但是,它不起作用,因为每一行都有不同数量的线路和车站。


我可能需要的是根据所包含的字符拆分列。例如,我可以将第一个“-line”存储到 Line1,并将第一个“-station”存储到 station1-1。


有没有人有任何想法如何做到这一点?


任何小想法都可以帮助我!


长风秋雁
浏览 101回答 1
1回答

ibeautiful

首先Series用Series.str.splitand创建DataFrame.stack:s = df['station'].str.split(expand=True).stack()min然后删除以by boolean indexingwith结尾的值Series.str.endswith:df1 = s[~s.str.endswith('min')].to_frame('data').rename_axis(('a','b'))line然后为s 和为station具有过滤和 的行创建计数器GroupBy.cumcount:df1['Line'] = (df1[df1['data'].str.endswith('line')]                         .groupby(level=0)                         .cumcount()                         .add(1)                         .astype(str))df1['Line'] = df1['Line'].ffill()df1['station'] = (df1[df1['data'].str.endswith('station')]                         .groupby(['a','Line'])                         .cumcount()                         .add(1)                         .astype(str))使用连接创建系列,将缺失值替换df1['Line']为Series.fillna:df1['station'] = (df1['Line'] + '-' + df1['station']).fillna(df1['Line'])DataFrame.set_index通过重塑DataFrame.unstack:df1 = df1.set_index('station', append=True)['data'].reset_index(level=1, drop=True).unstack()Rename列名 - 之前不是为了避免错误排序:df1 = df1.rename(columns = lambda x: 'Station' + x if '-' in x else 'Line' + x)删除列名:df1.columns.name = Nonedf1.index.name = Noneprint (df1)    Line1 Station1-1 Station1-2 Station1-3   Line2 Station2-10  A-line  B-station  C-station        NaN     NaN        NaN1  D-line  E-station        NaN        NaN  F-line  G-station2  G-line  H-station  I-station  J-station     NaN        NaN
随时随地看视频慕课网APP

相关分类

Python
我要回答