使用 Python pandas 将具有逗号值的字符串转换为多层索引的单独行

Posted

技术标签:

【中文标题】使用 Python pandas 将具有逗号值的字符串转换为多层索引的单独行【英文标题】:Turning a string with comma values into individual rows of a multi-layered index with Python pandas 【发布时间】:2020-10-02 03:41:17 【问题描述】:

我有一个 Pandas 数据框,目前看起来像这样:

df = pd.DataFrame('Film' : ['James Bond: Spectre', 'Avengers: Endgame'],
        'Year' : [2015, 2019],
        'Director(s)': ['Sam Mendes', 'Anthony Russo, Joe Russo'],
        'Actor(s)': ["Daniel Craig, Cristoph Waltz", "Robert Downey Jr., Chris Evans, Scarlett Johannson"])

         Film          | Year |     Director(s)    |        Actor(s)
 ----------------------|------|--------------------|-----------------------
 James Bond: Spectre   | 2015 |     Sam Mendes     |     Daniel Craig,
                       |      |                    |   Christoph Waltz
 ----------------------|------|--------------------|-----------------------
  Avengers: Endgame    | 2019 | Anthony Russo, Joe |   Robert Downey Jr.,   
                       |      |        Russo       | Chris Evans, Scarlett
                       |      |                    |       Johansson

我想用每个字符串中的逗号分隔演员列和导演列,以便它们成为多层列,其中每个新条目占据一个单独的单元格,如下所示:

         Film          | Year |     Director(s)   |        Actor(s)
 ----------------------|------|-------------------|----------------------
 James Bond: Spectre   | 2015 |     Sam Mendes    |     Daniel Craig
                       |      |                   |----------------------
                       |      |                   |    Christoph Waltz
 ----------------------|------|-------------------|----------------------
  Avengers: Endgame    | 2019 |   Anthony Russo   |   Robert Downey Jr.
                       |      |                   |----------------------  
                       |      |-------------------|      Chris Evans
                       |      |     Joe Russo     |----------------------
                       |      |                   |  Scarlett Johansson

我的首要任务是 Director(s) 列和 Actor(s) 列分别包含每个值,但两列的多层索引没有链接 - Anthony Russo 和 Robert Downey Jr. 没有内在联系他们与同一部电影的联系。

我对 Python 和 Pandas 还很陌生,所以我很欣赏这可能不是多索引的工作方式。如果有更有效的数据组织方式,我会很高兴听到!

【问题讨论】:

【参考方案1】:

我认为 Pandas 的 explode() 函数可能会解决您的需求。在此处查看示例https://cmdlinetips.com/2019/07/pandas-0-25-0-is-here-what-is-new-named-aggregation-explode-and-sparse-dataframe/

【讨论】:

据我了解,explode() 函数将创建新行而不是将列拆分为多层索引? 这似乎接近你想要的。 (使用“演员”而不是演员) df.assign(Actor=df.Actor.str.split(',')).explode('Actor').set_index(['Film', 'Year'])跨度>

以上是关于使用 Python pandas 将具有逗号值的字符串转换为多层索引的单独行的主要内容,如果未能解决你的问题,请参考以下文章

Pandas 将具有多个值的行数据合并到列的 Python 列表中

使用 Pandas 使用冒号、逗号和排序分隔值的数据框

具有先前值的 Python Pandas iterrows()

python 在Pandas中删除具有特定值的行(Python)

python&pandas:列表中具有值的子集数据框[重复]

Python Pandas - 查找具有最大聚合值的连续组