【问题标题】:Split list in Pandas dataframe column into multiple columns将 Pandas 数据框列中的列表拆分为多列
【发布时间】:2017-08-29 19:11:23
【问题描述】:

我正在处理电影数据,并且有一个电影类型的数据框列。目前,该列包含每部电影的电影流派列表(因为大多数电影都分配给多个流派),但出于分析的目的,我想解析该列表并为每个流派创建一个新的数据框列。因此,对于给定的电影,我不会使用genre=['Drama','Thriller'],而是有两列,例如genre1='Drama'和genre2='Thriller'。

这是我的数据的 sn-p:

{'color': {0: [u'Color::(Technicolor)'],
  1: [u'Color::(Technicolor)'],
  2: [u'Color::(Technicolor)'],
  3: [u'Color::(Technicolor)'],
  4: [u'Black and White']},
 'country': {0: [u'USA'],
  1: [u'USA'],
  2: [u'USA'],
  3: [u'USA', u'UK'],
  4: [u'USA']},
 'genre': {0: [u'Crime', u'Drama'],
  1: [u'Crime', u'Drama'],
  2: [u'Crime', u'Drama'],
  3: [u'Action', u'Crime', u'Drama', u'Thriller'],
  4: [u'Crime', u'Drama']},
 'language': {0: [u'English'],
  1: [u'English', u'Italian', u'Latin'],
  2: [u'English', u'Italian', u'Spanish', u'Latin', u'Sicilian'],
  3: [u'English', u'Mandarin'],
  4: [u'English']},
 'rating': {0: 9.3, 1: 9.2, 2: 9.0, 3: 9.0, 4: 8.9},
 'runtime': {0: [u'142'],
  1: [u'175'],
  2: [u'202', u'220::(The Godfather Trilogy 1901-1980 VHS Special Edition)'],
  3: [u'152'],
  4: [u'96']},
 'title': {0: u'The Shawshank Redemption',
  1: u'The Godfather',
  2: u'The Godfather: Part II',
  3: u'The Dark Knight',
  4: u'12 Angry Men'},
 'votes': {0: 1793199, 1: 1224249, 2: 842044, 3: 1774083, 4: 484061},
 'year': {0: 1994, 1: 1972, 2: 1974, 3: 2008, 4: 1957}}

任何帮助将不胜感激!谢谢!

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    我认为您需要 DataFrame 构造函数和 add_prefix 和最后一个 concat 到原始:

    df1 = pd.DataFrame(df.genre.values.tolist()).add_prefix('genre_')
    df = pd.concat([df.drop('genre',axis=1), df1], axis=1)
    

    时间安排

    df = pd.DataFrame(d)
    print (df)
    #5000 rows 
    df = pd.concat([df]*1000).reset_index(drop=True)
    
    In [394]: %timeit (pd.concat([df.drop('genre',axis=1), pd.DataFrame(df.genre.values.tolist()).add_prefix('genre_')], axis=1))
    100 loops, best of 3: 3.4 ms per loop
    
    In [395]: %timeit (pd.concat([df.drop(['genre'],axis=1),df['genre'].apply(pd.Series).rename(columns={0:'genre_0',1:'genre_1',2:'genre_2',3:'genre_3'})],axis=1))
    1 loop, best of 3: 757 ms per loop
    

    【讨论】:

      【解决方案2】:

      这应该适合你:

      pd.concat([df.drop(['genre'],axis=1),df['genre'].apply(pd.Series).rename(columns={0:'genre_0',1:'genre_1',2:'genre_2',3:'genre_3'})],axis=1)
      

      【讨论】:

      • 甚至不知道@jezrael 建议的add_prefix 选项。更具可读性。它会变成pd.concat([df.drop(['genre'],axis=1),df['genre'].apply(pd.Series).add_prefix('genre_')],axis=1)
      • 而且apply(pd.Series) 很慢,最好不要使用它。检查我的答案中的时间。
      猜你喜欢
      • 2016-10-13
      • 2023-01-11
      • 2016-05-31
      • 2023-02-17
      • 2020-02-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多