从只有1列名为val的现有数据帧创建新数据帧,优化的pandas命令应该是什么?使用以下转换。
输入:
1_2_3
1_2_3_4
1_2_3_4_5
输出:
2
2_3
2_3_4
删除第一个下划线(包括_)之前的所有内容,并删除最后一个_(包括_)之后的所有内容
您可以将str.replace
与正则表达式一起使用,该正则表达式匹配到并包括第一个_
和从最后一个_
到字符串末尾的字符,将这两个部分替换为空:
df['val'] = df['val'].str.replace('^[^_]*_(.*)_[^_]*$', r'1')
输出:
val
0 2
1 2_3
2 2_3_4
如果您希望在新数据框中使用该单列,可以使用to_frame
:
df2 = df['val'].str.replace('^[^_]*_(.*)_[^_]*$', r'1').to_frame()
分割后str切片的另一种方法:
df['val'].str.split("_").str[1:-1].str.join("_")
0 2
1 2_3
2 2_3_4
按r1和r2之间的字符分割字符串
r1=digit_
和r2=_digit
df.a.str.split('(?<=^d_)(.*?)(?=_d+$)').str[1]
您可以使用str.find
和str.rfind
找到第一个和最后一个_
,然后您可以从中获得子字符串。
df['val'] = [x[x.find('_')+1:x.rfind('_')] for x in df['val']]
输出:
val
0 2
1 2_3
2 2_3_4
您可以使用replace方法
df.vals = df.vals.str.replace(r'^1_', '').str.replace(r'_d$', '')
我传递了2个正则表达式,第一个找到子字符串1_并将其替换为空字符串,第二个找到子字符串,下划线后面跟着字符串末尾的数字(这就是'$'的意思)与空字符串。
与regex相关的问题总是很有趣。
我再加一个。str.extract
:
df['new_val'] = df['val'].str.extract('_(.+)_')
输出:
val new_val
0 1_2_3 2
1 1_2_3_4 2_3
2 1_2_3_4_5 2_3_4