为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

长风秋雁 2022-06-28 10:04:27
假设有如下列。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 只是任意字符,并且有很多这样的行。                                             station0             A-line B-station 9-min C-station 3-min1      D-line E-station 8-min F-line G-station 5-min2  G-line H-station 1-min I-station 6-min J-stati...我们如何制作如下所示的列?   Line1     Station1-1   Station1-2 Station1-3   Line2    Station2-10  A-line    B-station    C-station    null       null     null1  D-line    E-station    null         null       F-line   G-station2  G-line    H-station    I-station    J-station  null     nullstationX-X 表示Station(线路号)-(车站顺序)Station1-1 表示第一行(line1)的第一站Station1-2 表示第一行(line1)的第二站Station2-1 表示二线(line2)的第一站我试图按分隔符分割;但是,它不起作用,因为每一行都有不同数量的线路和车站。我可能需要的是根据所包含的字符拆分列。例如,我可以将第一个“-line”存储到 Line1,并将第一个“-station”存储到 station1-1。有没有人有任何想法如何做到这一点?任何小想法都可以帮助我!
查看完整描述

1 回答

?
ibeautiful

TA贡献1993条经验 获得超5个赞

首先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 = 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


查看完整回答
反对 回复 2022-06-28
  • 1 回答
  • 0 关注
  • 74 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信