在pandas中,如何在不同的列中拆分多行

2024-09-21 03:24:04 发布

您现在位置:Python中文网/ 问答频道 /正文

在下面的例子中,我有电影的数据:

我想将title列的值拆分为2个新列,即其中一个新列(“movie title”)将取=玩具总动员作为行值,另一个新列(“year”)将取=1995作为行值。在

如何对整个数据帧执行此操作?在

                            title  \
0                    Toy Story (1995)   
1                      Jumanji (1995)   
2             Grumpier Old Men (1995)   
3            Waiting to Exhale (1995)   
4  Father of the Bride Part II (1995) 

Tags: 数据电影titlemovieyearold例子玩具
3条回答

尝试将str accessor与split一起使用,使用一个查找空格和open paranthesis或close paranthesis的正则表达式:

df.title.str.split('\s\(|\)',expand=True)
  .drop(2, axis=1)
  .set_axis(['movies','year'], inplace=False, axis=1)

输出:

^{pr2}$

如果您不想要regex解决方案

df.title.str.rstrip(')').str.split('(').apply(pd.Series)


    0                           1
0   Toy Story                   1995
1   Jumanji                     1995
2   Grumpier Old Men            1995
3   Waiting to Exhale           1995
4   Father of the Bride Part II 1995

{cd1>使用^:

df[['movie_title', 'year']] = df.title.str.extract('(.*)\s\((\d+)', expand=True)

样本数据:

^{pr2}$

输出:

                                title                  movie_title  year
0                    Toy Story (1995)                    Toy Story  1995
1                      Jumanji (1995)                      Jumanji  1995
2             Grumpier Old Men (1995)             Grumpier Old Men  1995
3            Waiting to Exhale (1995)            Waiting to Exhale  1995
4  Father of the Bride Part II (1995)  Father of the Bride Part II  1995
5              Hello (Goodbye) (1995)              Hello (Goodbye)  1995

我们使用的正则表达式是:'(.*)\s\((\d+)'。在

表达式的第一部分是:(.*)。括号表示它是一个捕获组,括号内的内容表示我们要捕获的内容。在本例中,.*表示我们贪婪地想要捕获所有东西。在capturing组之后,我们有\s\(,它的字面意思是后面跟着一个左括号的空格,所以' ('。因为在此之前的捕获组是贪婪的,如果有多个这样的匹配,我们将捕获直到最后' ('的所有内容。(例如,查看它如何正确地捕获Hello (Goodbye) (1995)。在

最后,我们添加第二个捕获组,其中\d+作为我们要捕获的内容,它捕获标题中最后一个' ('之后的所有数字,对我们来说,这将是4位数的年份。在

相关问题 更多 >

    热门问题