从python中已有的df创建新的df



从只有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.findstr.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

最新更新