Python:使用Lambda将字符串字段拆分为3个单独的字段
我有一个Python数据框架,其中包括一个名为“SEGMENT”的列。我想把这列分成三列。请查看我所需的黄色突出显示的输出 下面是我尝试过的代码。不幸的是,我甚至不能让第一个replace语句工作。:不会替换为-。非常感谢您的帮助Python:使用Lambda将字符串字段拆分为3个单独的字段,python,string,pandas,lambda,split,Python,String,Pandas,Lambda,Split,我有一个Python数据框架,其中包括一个名为“SEGMENT”的列。我想把这列分成三列。请查看我所需的黄色突出显示的输出 下面是我尝试过的代码。不幸的是,我甚至不能让第一个replace语句工作。:不会替换为-。非常感谢您的帮助 df_stack_ranking['CURRENT_AUM_SEGMENT'] = df_stack_ranking['CURRENT_AUM_SEGMENT'].replace(':', '-') s = df_stack_ranking['CURRENT_AU
df_stack_ranking['CURRENT_AUM_SEGMENT'] = df_stack_ranking['CURRENT_AUM_SEGMENT'].replace(':', '-')
s = df_stack_ranking['CURRENT_AUM_SEGMENT'].str.split(' ').apply(Series, 1).stack()
s.index = s.index.droplevel(-1)
s.name = 'SEGMENT'
df_stack_ranking.join(s.apply(lambda x: Series(x.split(':'))))
设置
df = pd.DataFrame({'SEGMENT': {0: 'Hight:33-48', 1: 'Hight:33-48', 2: 'Very Hight:80-88'}})
df
Out[17]:
SEGMENT
0 Hight:33-48
1 Hight:33-48
2 Very Hight:80-88
解决方案
使用“拆分”将柱拆分为3个部分,然后展开以创建新的DF
df.SEGMENT.str.split(':|-',expand=True)\
.rename(columns=dict(zip(range(3),\
['SEGMENT','SEGMENT RANGE LOW','SEGMENT RANGE HIGH'])))
Out[13]:
SEGMENT SEGMENT RANGE LOW SEGMENT RANGE HIGH
0 Hight 33 48
1 Hight 33 48
2 Very Hight 80 88
用连字符替换冒号,然后在连字符上拆分以获取3列的值列表。然后为3列中的每一列指定值并删除临时列 我将使用正则表达式对str.extract执行此操作
df.SEGMENT.str.extract('([A-Za-z ]+):(\d+)-(\d+)', expand = True).rename(columns = {0: 'SEGMENT', 1: 'SEGMENT RANGE LOW', 2: 'SEGMENT RANGE HIGH'})
SEGMENT SEGMENT RANGE LOW SEGMENT RANGE HIGH
0 High 33 48
1 High 33 48
2 Very High 80 88
由:
或(|)使用\s*-\s*
(\s*
表示零个或多个空格):
解决方案包括:
因为我喜欢从str.extract
regex中命名列
regex = '\s*(?P<SEGMENT>\S+)\s*:\s*(?P<SEGMENT_RANGE_LOW>\S+)\s*-\s*(?P<SEGMENT_RANGE_HIGH>\S+)\s*'
df.SEGMENT.str.extract(regex, expand=True)
SEGMENT SEGMENT_RANGE_LOW SEGMENT_RANGE_HIGH
0 High 33 48
1 High 33 48
2 High 80 88
很高兴能帮上忙;)
df = pd.DataFrame({'SEGMENT': ['Hight: 33 - 48', 'Hight: 33 - 48', 'Very Hight: 80 - 88']})
cols = ['SEGMENT','SEGMENT RANGE LOW','SEGMENT RANGE HIGH']
df[cols] = df['SEGMENT'].str.split(':\s*|\s*-\s*',expand=True)
print (df)
SEGMENT SEGMENT RANGE LOW SEGMENT RANGE HIGH
0 Hight 33 48
1 Hight 33 48
2 Very Hight 80 88
cols = ['SEGMENT','SEGMENT RANGE LOW','SEGMENT RANGE HIGH']
df[cols] = df['SEGMENT'].str.extract('([A-Za-z\s*]+):\s*(\d+)\s*-\s*(\d+)', expand = True)
print (df)
SEGMENT SEGMENT RANGE LOW SEGMENT RANGE HIGH
0 Hight 33 48
1 Hight 33 48
2 Very Hight 80 88
regex = '\s*(?P<SEGMENT>\S+)\s*:\s*(?P<SEGMENT_RANGE_LOW>\S+)\s*-\s*(?P<SEGMENT_RANGE_HIGH>\S+)\s*'
df.SEGMENT.str.extract(regex, expand=True)
SEGMENT SEGMENT_RANGE_LOW SEGMENT_RANGE_HIGH
0 High 33 48
1 High 33 48
2 High 80 88
df = pd.DataFrame({'SEGMENT': ['High: 33 - 48', 'High: 33 - 48', 'Very High: 80 - 88']})