【问题标题】:Python pandas split column list into multiple columnsPython pandas 将列列表拆分为多列
【发布时间】:2020-02-10 11:04:51
【问题描述】:

我有一个如下所示的 Pandas 数据框,带有一个索引和两列。 “Image_main”列包含一个 url 列表。

我想要做的是将“image_main”列列表中的每个项目分隔到同一数据框中的新列中。列表的长度在每一行中是不同的。例如,第 1 行的列表有 4 个 url,而第 3 行只有 2 个 url。

index   image_main                                      referenceID
0     ['https://x.com/1.jpg','https://x.com/2.jpg',...  3.297439e+10
1     ['https://y.com/1.jpg','https://y.com/2.jpg',...  4.000220e+12
2     ['https://z.com/1.jpg','https://z.com/2.jpg',...  4.000130e+12
3     ['https://v.com/1.jpg','https://v.com/2.jpg',...  3.296914e+10
4     ['https://a.com/1.jpg','https://a.com/2.jpg',...  4.000080e+12

到目前为止,我已经根据对以下问题的答案进行了以下尝试:Pandas: split column of lists of unequal length into multiple columns。但是,它似乎不起作用,因为我得到了与以前相同的结果

df['image_main'] = pd.DataFrame(df['image_main'].values.tolist()).add_prefix('code_')
print(df)

    image_main                                         referenceID
0   ['https://x.com/1.jpg','https://x.com/2.jpg',...   3.297439e+10
1    ['https://y.com/1.jpg','https://y.com/2.jpg',...   4.000220e+12
2    ['https://z.com/1.jpg','https://z.com/2.jpg',...   4.000130e+12
3    ['https://v.com/1.jpg','https://v.com/2.jpg',...   3.296914e+10
4    ['https://a.com/1.jpg','https://a.com/2.jpg',...   4.000080e+12

如何将 image_main 列中的每个项目拆分为同一数据框中的新单独列?

所需的结果类似于以下内容:

    image_main     referenceID.     image_1.                  image 2                ....
0   ...,...        3.297439e+10.    'https://x.com/1.jpg'    'https://x.com/2.jpg' 
1   ...,...        3.297439e+10.    'https://y.com/1.jpg'    'https://y.com/2.jpg' 
2   ...,...        3.297439e+10.    'https://z.com/1.jpg'    'https://z.com/2.jpg' 
3   ...,...        3.297439e+10.    'https://v.com/1.jpg'    'https://v.com/2.jpg' 
4   ...,...        3.297439e+10.    'https://a.com/1.jpg'    'https://a.com/2.jpg' 


【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    当我尝试时,您链接的线程中的解决方案运行良好。

    您不将转换分配给列,而是将其与主数据框连接


    df.join(pd.DataFrame(df["image_main"].values.tolist()).add_prefix('image_'))
    

    编辑:

    要将image_main 字符串值转换为列表,请使用以下命令:

    df["image_main"] = df["image_main"].str.replace("\[|\]|\'", "").str.split(",")
    df.join(pd.DataFrame(df["image_main"].values.tolist()).add_prefix('image_'))
    

    【讨论】:

      【解决方案2】:

      我认为您缺少的是 pd.merge:

      df:
      
           A
      0   [1, 2, 3, 4]
      1   [1, 2, 3, 4]
      2   [1, 2, 3, 4]
      
      

      合并到新的df中:

      pd.merge(df, pd.DataFrame(df['A'].values.tolist()).add_prefix('code_'), on=df.index)
      

      输出:

          key_0   A             code_0    code_1  code_2  code_3
      0   0       [1, 2, 3, 4]    1         2       3      4
      1   1       [1, 2, 3, 4]    1         2       3      4
      2   2       [1, 2, 3, 4]    1         2       3      4
      
      

      【讨论】:

      • 它对我不起作用。我刚刚意识到问题在于“image_main”中的值是一个字符串而不是一个列表。 “['1,2,3']”。如何将其转换为列表,以便与您共享的代码有效?
      • df['A'] = df['A'].apply(lambda x: re.match('\[(.*)\]',x).group(1)) pd.merge(df, pd.DataFrame(df['A'].str.split(',').values.tolist()).add_prefix('code_'), on=df.index) 应该可以解决问题,但感觉效率有点低。我会试着在早上考虑一下
      猜你喜欢
      • 2023-01-11
      • 2016-05-31
      • 2021-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-28
      相关资源
      最近更新 更多