从熊猫现有的df创建新的df - python

时间:2021-02-12 03:19:16

标签: python pandas

从只有 1 列名为 val 的现有数据框创建新数据框的优化 Pandas 命令应该是什么,并进行以下转换。

输入:

1_2_3
1_2_3_4
1_2_3_4_5

输出:

2
2_3
2_3_4

删除第一个下划线之前的所有内容(包括 _)并删除最后一个 _ 之后的所有内容(包括 _)

6 个答案:

答案 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