如何为列表中的每个元素创建不同的列?

分享于2022年07月17日 pandas python 问答
【问题标题】:如何为列表中的每个元素创建不同的列?(How to make different columns for each elements in a list?)
【发布时间】:2022-01-26 00:02:40
【问题描述】:

我有一个 pandas 数据框列,其中包含字符串列表(长度不同),如下所示: df['category'] :

category                                                                           | ...
---------
['Grocery & Gourmet Food', 'Cooking & Baking', 'Lard & Shortening', 'Shortening']  | ...
['Grocery & Gourmet Food', 'Candy & Chocolate', 'Mints']                           | ...
['Grocery & Gourmet Food', 'Soups, Stocks & Broths', 'Broths', 'Chicken']          | ...

现在,我想为列表中的每个字符串元素将此类别列分成不同的列。可以使用熊猫吗?我将如何处理列名?

我已经阅读了这个 question 的答案,但不同的是我的列表长度并不总是相同。

我的预期输出如下所示:

category_1             | category_2       |  category_n  | other_columns 
------------------------------------------------------------------
Grocery & Gourmet Food | Cooking & Baking | Lard & Shortening | ...
...                    | ...              | ...               | ...

  • 请您添加您预期输出的样本吗?
  • 例如 this answer 到链接的问题适用于不同大小的列表,列名将自动生成。

【解决方案1】:

我会这样做:

df2 = pd.DataFrame(df['category'].to_list(), columns=[f"category_{i+1}" for i in range(len(df['category'].max()))])
df = pd.concat([df.drop('category', axis=1), df2], axis=1)

输出:

               category_1              category_2         category_3  \
0  Grocery & Gourmet Food        Cooking & Baking  Lard & Shortening   
1  Grocery & Gourmet Food       Candy & Chocolate              Mints   
2  Grocery & Gourmet Food  Soups, Stocks & Broths             Broths   

   category_4  
0  Shortening  
1        None  
2     Chicken 

编辑:

正如 @mozway 建议的那样,最好使用默认名称创建列,然后更新它们:

df2 = pd.DataFrame(df['category'].to_list())
df2.columns = df2.columns.map(lambda x: f'category_{x+1}')
df = pd.concat([df.drop('category', axis=1), df2], axis=1)

  • 最好先用默认列名创建 df2 ,然后用 df2.columns = df2.columns.map(lambda x: f'category_{x+1}') 更新
  • @mozway 没错,这实际上更好。谢谢,我编辑了我的答案。
  • @SpicyPhoenix 这个编辑后的答案创建了另一个名为 category_1 的列,它只是 category 列的另一个副本。
  • @sksoumik 这很奇怪。我刚刚自己测试过,输出和我发布的一样。 i.imgur.com/hpa7R0v.png
  • @SpicyPhoenix,对不起。我的类别列的项目实际上是 str 不是列表。这就是为什么它不起作用。我使用 ast 将其转换为列表。现在,它正在工作。谢谢