【问题标题】:Pandas df how to change specific columns to remove list from a single-element listPandas df 如何更改特定列以从单元素列表中删除列表
【发布时间】:2021-12-05 10:52:25
【问题描述】:

我有一个 5 列的 pandas 数据框:

    ID             Title         Sponsor name       Date       Comparator 

0   [NT0235]     [bla bla bla]  [sponsor name1]  2021-08-13    [comparator1]
1   [NT0236]     [bla bla bla]  [sponsor name2]  2021-08-12    [comparator2]
2   [NT0237]     [bla bla bla]  [sponsor name3]  2021-08-11    [comparator3]
3   [NT0238]     [bla bla bla]  [sponsor name4]  2021-08-10    [comparator4]
4   [NT0239]     [bla bla bla]  [sponsor name5]  2021-08-09    [comparator5]

我需要从列中删除列表:ID、标题、赞助商名称和比较器,因为它们都是单元素列表(如果不是,可以使用空格作为分隔符将元素连接起来)。 我该怎么做呢?谢谢!

这是df:

import pandas as pd
    
data = {'ID': [['NT0235'],['NT0236'],['NT0237'],['NT0238'],['NT0239']],'Title': [['bla bla bla'] , ['bla bla bla'] , ['bla bla bla'], ['bla bla bla'] , ['bla bla bla']] , 'Sponsor name': [['sponsor name1'], ['sponsor name2'], ['sponsor name3'], ['sponsor name4'], ['sponsor name5']], 'Date': ['2021-08-13','2021-08-12','2021-08-11','2021-08-10','2021-08-09'], 'Comparator': [['comparator1'], ['comparator2'], ['comparator3'], ['comparator4'], ['comparator5']]
}
    
df = pd.DataFrame(data)

我需要的是这个df:

    ID             Title         Sponsor name       Date       Comparator 

0   NT0235     bla bla bla     sponsor name1     2021-08-13    comparator1
1   NT0236     bla bla bla     sponsor name2     2021-08-12    comparator2
2   NT0237     bla bla bla     sponsor name3     2021-08-11    comparator3
3   NT0238     bla bla bla     sponsor name4     2021-08-10    comparator4
4   NT0239     bla bla bla     sponsor name5     2021-08-09    comparator5

【问题讨论】:

    标签: python pandas list dataframe


    【解决方案1】:

    如果有lists(和里面的字符串),您可以通过空格连接值 - 它适用于一个元素和多个元素列表:

    df = df.applymap(lambda x: ' '.join(x) if isinstance(x, list) else x)
    

    如果可能的话,一些数值:

    df = df.applymap(lambda x: ' '.join(map(str, x)) if isinstance(x, list) else x)
    

    【讨论】:

      【解决方案2】:

      对于这种简单的情况,你可以使用DataFrame.apply()在每一列上应用pd.Series.explode,如下:

      df = df.apply(pd.Series.explode)
      

      结果:

      print(df)
      
      
             ID        Title   Sponsor name        date   comparator
      0  NT0235  bla bla bla  sponsor name1  2021-08-13  comparator1
      1  NT0236  bla bla bla  sponsor name2  2021-08-12  comparator2
      2  NT0237  bla bla bla  sponsor name3  2021-08-11  comparator3
      3  NT0238  bla bla bla  sponsor name4  2021-08-10  comparator4
      4  NT0239  bla bla bla  sponsor name5  2021-08-09  comparator5
      

      如果您只想对选定的列应用,可以使用:

      df[['ID', 'Title', 'Sponsor name', 'Comparator']] = df[['ID', 'Title', 'Sponsor name', 'Comparator']].apply(pd.Series.explode)
      

      【讨论】:

        【解决方案3】:

        用途:

        df[['ID', 'Title', 'Sponsor name', 'Comparator']] = df[['ID', 'Title', 'Sponsor name', 'Comparator']].apply(lambda x: x.explode())
        

        输出:

               ID        Title   Sponsor name        Date   Comparator
        0  NT0235  bla bla bla  sponsor name1  2021-08-13  comparator1
        1  NT0236  bla bla bla  sponsor name2  2021-08-12  comparator2
        2  NT0237  bla bla bla  sponsor name3  2021-08-11  comparator3
        3  NT0238  bla bla bla  sponsor name4  2021-08-10  comparator4
        4  NT0239  bla bla bla  sponsor name5  2021-08-09  comparator5
        

        【讨论】:

          猜你喜欢
          • 2019-04-22
          • 2022-11-14
          • 2020-07-23
          • 1970-01-01
          • 2021-03-10
          • 2023-02-01
          • 1970-01-01
          • 2016-08-16
          • 1970-01-01
          相关资源
          最近更新 更多