从pandas-python中的现有df创建新df
优化的pandas命令应该是什么,以便通过以下转换从只有一列名为val的现有数据帧创建新数据帧 输入:从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
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