如何提取 Pandas 列中字符串的一部分并创建一个新列

rra*_*rra 7 python dataframe pandas

我有下面的熊猫数据框。

d = {'col1': [1, 2,3,4,5,60,0,0,6,3,2,4],'col3': [1, 22,33,44,55,60,1,5,6,3,2,4],'Name': ['2a df a1asd_V1', 'xcd a2asd_V3','23vg aabsd_V1','dfgdf_aabsd_V0','a3as  d_V1','aa bsd_V3','aasd_V4','aabsd_V4','aa_adn sd_V15',np.nan,'aasd_V12','aasd120Abs'],'Date': ['2021-06-13', '2021-06-13','2021-06-13','2021-06-14','2021-06-15','2021-06-15','2021-06-13','2021-06-16','2021-06-13','2021-06-13','2021-06-13','2021-06-16']}
dff = pd.DataFrame(data=d)
dff

    col1    col3    Name            Date       
0   1       1       2a df a1asd_V1  2021-06-13 
1   2       22      xcd a2asd_V3    2021-06-13 
2   3       33      23vg aabsd_V1   2021-06-13 
3   4       44      dfgdf_aabsd_V0  2021-06-14 
4   5       55      a3as d_V1       2021-06-15 
5   60      60      aa bsd_V3       2021-06-15 
6   0       1       aasd_V4         2021-06-13 
7   0       5       aabsd_V4        2021-06-16 
8   6       6       aa_adn sd_V10   2021-06-13 
9   3       3       NaN             2021-06-13 
10  2       2       aasd_V12        2021-06-13 
11  4       4       aasd120Abs      2021-06-16 
Run Code Online (Sandbox Code Playgroud)

我想根据“名称”列创建两个新列。我想提取名称列中的字符串部分,例如 V1、V2、V3、V4...V20 等。另外,如果名称字符串末尾没有类似的内容或者名称行为空,则只想创建一个空单元格。所以我想要类似下面的 pandas 数据框的东西。

    col1    col3    Name            Date         Version        Version
0   1       1       2a df a1asd_V1  2021-06-13      V1          Version 1
1   2       22      xcd a2asd_V3    2021-06-13      V3          Version 3
2   3       33      23vg aabsd_V1   2021-06-13      V1          Version 1
3   4       44      dfgdf_aabsd_V0  2021-06-14      V0          Version 0
4   5       55      a3as d_V1       2021-06-15      V1          Version 1
5   60      60      aa bsd_V3       2021-06-15      V3          Version 3
6   0       1       aasd_V4         2021-06-13      V4          Version 4
7   0       5       aabsd_V4        2021-06-16      V4          Version 4
8   6       6       aa_adn sd_V10   2021-06-13      V10         Version 10
9   3       3       NaN             2021-06-13                  
10  2       2       aasd_V12        2021-06-13      V12         Version 12
11  4       4       aasd120Abs      2021-06-16      
Run Code Online (Sandbox Code Playgroud)

可以这样做吗?我知道在 SQL 中我们可以使用“LIKE”来做到这一点

WHEN `Name` LIKE '%V10%' THEN 'Verison 10'.
Run Code Online (Sandbox Code Playgroud)

python 中是否有类似的命令或任何其他方法可以做到这一点?

提前致谢!任何帮助表示赞赏!

Cor*_*ien 13

str.extract与正则表达式一起使用str.replace并重命名值:

dff['Version_short'] = dff['Name'].str.extract('_(V\d+)$').fillna('')
dff['Version_long'] = dff['Version_short'].str.replace('V', 'Version ')
Run Code Online (Sandbox Code Playgroud)

输出:

>>> dff
    col1  col3            Name        Date Version_short Version_long
0      1     1  2a df a1asd_V1  2021-06-13            V1    Version 1
1      2    22    xcd a2asd_V3  2021-06-13            V3    Version 3
2      3    33   23vg aabsd_V1  2021-06-13            V1    Version 1
3      4    44  dfgdf_aabsd_V0  2021-06-14            V0    Version 0
4      5    55      a3as  d_V1  2021-06-15            V1    Version 1
5     60    60       aa bsd_V3  2021-06-15            V3    Version 3
6      0     1         aasd_V4  2021-06-13            V4    Version 4
7      0     5        aabsd_V4  2021-06-16            V4    Version 4
8      6     6   aa_adn sd_V15  2021-06-13           V15   Version 15
9      3     3             NaN  2021-06-13                           
10     2     2        aasd_V12  2021-06-13           V12   Version 12
11     4     4      aasd120Abs  2021-06-16                           
Run Code Online (Sandbox Code Playgroud)


moz*_*way 5

您可以使用str.extract一个简短的正则表达式 ( _(V\d+)$):

dff['Version'] = dff['Name'].str.extract('_(V\d+)$')
dff['Version_long'] = 'Version '+dff['Version'].str[1:]
Run Code Online (Sandbox Code Playgroud)

注意。我以不同的方式命名第二列,因为两列同名是有问题的(尽管并非完全不可能)

输出:

    col1  col3            Name        Date Version Version_long
0      1     1  2a df a1asd_V1  2021-06-13      V1    Version 1
1      2    22    xcd a2asd_V3  2021-06-13      V3    Version 3
2      3    33   23vg aabsd_V1  2021-06-13      V1    Version 1
3      4    44  dfgdf_aabsd_V0  2021-06-14      V0    Version 0
4      5    55      a3as  d_V1  2021-06-15      V1    Version 1
5     60    60       aa bsd_V3  2021-06-15      V3    Version 3
6      0     1         aasd_V4  2021-06-13      V4    Version 4
7      0     5        aabsd_V4  2021-06-16      V4    Version 4
8      6     6   aa_adn sd_V15  2021-06-13     V15   Version 15
9      3     3             NaN  2021-06-13     NaN          NaN
10     2     2        aasd_V12  2021-06-13     V12   Version 12
11     4     4      aasd120Abs  2021-06-16     NaN          NaN
Run Code Online (Sandbox Code Playgroud)