从只有 1 列名为 val 的现有数据框创建新数据框的优化 Pandas 命令应该是什么,并进行以下转换。
输入:
1_2_3
1_2_3_4
1_2_3_4_5
输出:
2
2_3
2_3_4
删除第一个下划线之前的所有内容(包括 _)并删除最后一个 _ 之后的所有内容(包括 _)
答案 0 :(得分:3)
您可以将 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()
答案 1 :(得分:1)
拆分后使用 str 切片的另一种方法:
df['val'].str.split("_").str[1:-1].str.join("_")
0 2
1 2_3
2 2_3_4
答案 2 :(得分:1)
通过字符串 r1 开头和字符串 r2 结尾之间的字符分割字符串
其中 r1=digit_
和 r2=_digit
df.a.str.split('(?<=^\d\_)(.*?)(?=\_\d+$)').str[1]
答案 3 :(得分: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
答案 4 :(得分:1)
您可以使用 replace 方法来完成
df.vals = df.vals.str.replace(r'^1_', '').str.replace(r'_\d$', '')
我传递了 2 个正则表达式,第一个找到子字符串 1_ 并用空字符串替换它,第二个找到带有下划线的子字符串,后跟字符串末尾的数字(这就是“$”的意思)带有一个空字符串。
答案 5 :(得分:1)
与正则表达式相关的问题总是很有趣。
我再放一个。这是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