繁体   English   中英

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

[英]create new df from existing df in pandas - python

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

输入:

1_2_3
1_2_3_4
1_2_3_4_5

Output:

2
2_3
2_3_4

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

您可以将str.replace与匹配字符的正则表达式一起使用,直到并包括第一个_和从最后一个_到字符串的末尾,将这两个部分都替换为空:

df['val'] = df['val'].str.replace('^[^_]*_(.*)_[^_]*$', r'\1')

Output:

     val
0      2
1    2_3
2  2_3_4

如果您想要新 dataframe 中的单列,您可以使用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找到第一个和最后一个_ ,然后您可以从中获取 substring。

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

Output:

     val
0      2
1    2_3
2  2_3_4

您可以使用替换方法来做到这一点

df.vals = df.vals.str.replace(r'^1_', '').str.replace(r'_\d$', '')

我正在传递 2 个正则表达式,第一个找到 substring 1_ 并将其替换为空字符串,第二个找到带有下划线后跟数字的子字符串(这就是 '$' 的含义)与一个空细绳。

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

我会再扔一个。 这是str.extract

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

Output:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM