代码之家  ›  专栏  ›  技术社区  ›  Rafael Peixoto

熊猫有什么类似于dplyr的“列表列”的吗

  •  0
  • Rafael Peixoto  · 技术社区  · 2 年前

    在我的数据分析中,我目前正在从R转换到Python,有一件事我在任何教程中都没有看到:Pandas中有什么类似于dplyr的“列表列”的吗?

    https://www.rstudio.com/resources/webinars/how-to-work-with-list-columns/

    1 回复  |  直到 2 年前
        1
  •  1
  •   BeRT2me    2 年前

    pandas 将接受对象类型列中的任何对象类型,包括列表。

    df = pd.DataFrame()
    df['genre']=['drama, comedy, action', 'romance, sci-fi, drama','horror']
    df.genre = df.genre.str.split(', ')
    print(df, '\n', df.genre.dtype, '\n', type(df.genre[0]))
    
    # Output:
    
                          genre
    0   [drama, comedy, action]
    1  [romance, sci-fi, drama]
    2                  [horror]
     object
     <class 'list'>
    

    • genre 是一列列表。
    • 这个 dtype 体裁 列为 object
    • 的第一个值的类型 体裁 list .

    有很多 str 使用列表的函数。

    例如:

    print(df.genre.str.join(' | '))
    
    # Output:
    
    0     drama | comedy | action
    1    romance | sci-fi | drama
    2                      horror
    Name: genre, dtype: object
    
    print(df.genre.str[::2])
    
    # Output:
    
    0     [drama, action]
    1    [romance, drama]
    2            [horror]
    Name: genre, dtype: object
    

    其他操作通常可以通过 apply 函数(如果没有内置方法):

    print(df.genre.apply(lambda x: max(x)))
    
    # Output:
    
    0     drama
    1    sci-fi
    2    horror
    Name: genre, dtype: object
    

    有关更多信息,请参阅文档。。。 pandas str functions


    至于在彼此之间嵌套数据帧,它是 但是,我认为这被认为是一种反模式 熊猫 会一路与你搏斗:

    data = {'df1': df, 'df2': df}
    df2 = pd.Series(data.values(), data.keys()).to_frame()
    df2.columns = ['dfs']
    print(df2)
    
    # Output:
    
                                                       dfs
    df1                        genre
    0   [drama, comedy...
    df2                        genre
    0   [drama, comedy...
    
    print(df2['dfs'][0])
    
    # Output:
    
                          genre
    0   [drama, comedy, action]
    1  [romance, sci-fi, drama]
    2                  [horror]
    

    请参阅:

    一种可能可以接受的解决方法是将它们存储为 numpy

    df2 = df2.applymap(np.array)
    print(df2)
    print(df2['dfs'][0])
    
    # Output:
    
                                                       dfs
    df1  [[[drama, comedy, action]], [[romance, sci-fi,...
    df2  [[[drama, comedy, action]], [[romance, sci-fi,...
    
    array([[list(['drama', 'comedy', 'action'])],
           [list(['romance', 'sci-fi', 'drama'])],
           [list(['horror'])]], dtype=object)