从pandas-python中的现有df创建新df

从pandas-python中的现有df创建新df,python,pandas,Python,Pandas,优化的pandas命令应该是什么,以便通过以下转换从只有一列名为val的现有数据帧创建新数据帧 输入: 1_2_3 1_2_3_4 1_2_3_4_5 输出: 2 2_3 2_3_4 val 0 2 1 2_3 2 2_3_4 val 0 2 1 2_3 2 2_3_4 val new_val 0 1_2_3 2 1 1_2_3_4 2_3 2 1_2_3_4_5

优化的pandas命令应该是什么,以便通过以下转换从只有一列名为val的现有数据帧创建新数据帧

输入:

1_2_3
1_2_3_4
1_2_3_4_5
输出:

2
2_3
2_3_4
     val
0      2
1    2_3
2  2_3_4
     val
0      2
1    2_3
2  2_3_4
         val  new_val
0      1_2_3        2
1    1_2_3_4      2_3
2  1_2_3_4_5    2_3_4
删除所有内容,直到第一个下划线(包括u)为止,也删除最后一个下划线(包括)之后的所有内容。

您可以与正则表达式一起使用,该正则表达式匹配第一个
\u
之前的字符,以及从最后一个
\u
到字符串末尾的字符,将这两部分替换为零:

df['val']=df['val'].str.replace('^[^.]*.[u(.*).[^.]*$,r'\1')
输出:

2
2_3
2_3_4
     val
0      2
1    2_3
2  2_3_4
     val
0      2
1    2_3
2  2_3_4
         val  new_val
0      1_2_3        2
1    1_2_3_4      2_3
2  1_2_3_4_5    2_3_4
如果希望在新数据帧中包含该单列,可以使用以下方法将其转换为一列:

df2=df['val'].str.replace('^[^.]*.[u(.*).[^.]*$,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=数字
r2=\u数字

df.a.str.split('(?<=^\d\_)(.*?)(?=\_\d+$)').str[1]

df.a.str.split(”(?您可以使用
str.find
str.rfind
找到第一个和最后一个
,然后可以从中获取子字符串

df['val'] = [x[x.find('_')+1:x.rfind('_')] for x in df['val']]
输出:

2
2_3
2_3_4
     val
0      2
1    2_3
2  2_3_4
     val
0      2
1    2_3
2  2_3_4
         val  new_val
0      1_2_3        2
1    1_2_3_4      2_3
2  1_2_3_4_5    2_3_4
你可以用这个方法来做


我正在传递2个正则表达式,第一个正则表达式找到子字符串1并用空字符串替换它,第二个正则表达式找到子字符串,子字符串后面有一个下划线,后面有一个数字(这就是“$”的意思)和一个空字符串。

与正则表达式相关的问题总是很有趣的

我再加一个。这里是
str.extract

df['new_val'] = df['val'].str.extract('_(.+)_')
输出:

2
2_3
2_3_4
     val
0      2
1    2_3
2  2_3_4
     val
0      2
1    2_3
2  2_3_4
         val  new_val
0      1_2_3        2
1    1_2_3_4      2_3
2  1_2_3_4_5    2_3_4