首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何根据包含的文本值将熊猫数据框架列拆分为多列

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

Stack Overflow用户
提问于 2019-10-17 05:35:33
回答 1查看 88关注 0票数 2

假设有如下所示的列。

代码语言:javascript
复制
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只是任意字符,有很多这样的行。

代码语言:javascript
复制
                                             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...

我们如何制作像下面这样的列呢?

代码语言:javascript
复制
   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。

有人知道怎么做吗?

任何小小的想法都能帮助我!

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-17 06:03:41

首先使用SeriesSeries.str.split创建DataFrame.stack

代码语言:javascript
复制
s = df['station'].str.split(expand=True).stack()

然后删除以min结尾的值,boolean indexingSeries.str.endswith结尾

代码语言:javascript
复制
df1 = s[~s.str.endswith('min')].to_frame('data').rename_axis(('a','b'))

然后为linestation行创建带有筛选和GroupBy.cumcount的计数器。

代码语言:javascript
复制
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缺少的值

代码语言:javascript
复制
df1['station'] = (df1['Line'] + '-' + df1['station']).fillna(df1['Line'])

DataFrame.set_indexDataFrame.unstack进行整形

代码语言:javascript
复制
df1 = df1.set_index('station', append=True)['data'].reset_index(level=1, drop=True).unstack()

Rename列名--为了避免排序错误,在此之前不会:

代码语言:javascript
复制
df1 = df1.rename(columns = lambda x: 'Station' + x if '-' in x else 'Line' + x)

删除列名:

代码语言:javascript
复制
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        NaN
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58425554

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档