假设有如下所示的列。
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站X-X是指该站(线路号)-(车站的顺序)
Station1-1是指第一线的第一站(Line1)。
Station1-2是指第二线站(Line1)。
Station2-1是第二线的第一站(Line2)。
I试图按分隔符拆分;但是,它不能工作,因为每行都有不同的行数和站数。
我可能需要的是根据所包含的字符拆分列。例如,我可以先将'-line‘存储到Line1,然后将'-station’存储到站点1-1。
有人知道怎么做吗?
任何小小的想法都能帮助我!
谢谢!
发布于 2019-10-17 06:03:41
首先使用Series和Series.str.split创建DataFrame.stack
s = df['station'].str.split(expand=True).stack()然后删除以min结尾的值,boolean indexing以Series.str.endswith结尾
df1 = s[~s.str.endswith('min')].to_frame('data').rename_axis(('a','b'))然后为line和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 = None
df1.index.name = None
print (df1)
Line1 Station1-1 Station1-2 Station1-3 Line2 Station2-1
0 A-line B-station C-station NaN NaN NaN
1 D-line E-station NaN NaN F-line G-station
2 G-line H-station I-station J-station NaN NaNhttps://stackoverflow.com/questions/58425554
复制相似问题