📌  相关文章
📜  在 Pandas 中将类似列表的列元素转换为单独的行

📅  最后修改于: 2022-05-13 01:55:31.011000             🧑  作者: Mango

在 Pandas 中将类似列表的列元素转换为单独的行

数据框是一种表格结构,其中数据按行和列排列。通常在处理真实数据时,会遇到具有类似列表元素的列。类列表意味着元素的形式可以很容易地转换为列表。在本文中,我们将看到各种将类似列表的列元素转换为单独行的方法。

首先,让我们创建一个将用于所有方法的数据框。

Python
# import Pandas library
import pandas as pd
  
# create dataframe with a column (names) having list-like elements
data = {'id': [1, 2, 3],
        'names': ["Tom,Rick,Hardy", "Ritu,Shalini,Anjana", "Ali,Amir"]}
  
df = pd.DataFrame(data)
  
print(df)


Python
# assign the names series to a variable with 
# the same name and create a list column
df_melt = df.assign(names=df.names.str.split(","))
  
print(df_melt)


Python
df_melt.names.apply(pd.Series)


Python
df_melt.names.apply(pd.Series) \
    .merge(df_melt, right_index = True, left_index = True)


Python
df_melt.names.apply(pd.Series) \
   .merge(df_melt, right_index = True, left_index = True) \
   .drop(["names"], axis = 1) \
   .melt(id_vars = ['id'], value_name = "names")


Python
df_melt = df.assign(names=df.names.str.split(","))
df_melt = df_melt.names.apply(pd.Series) \
    .merge(df_melt, right_index=True, left_index=True) \
    .drop(["names"], axis=1) \
    .melt(id_vars=['id'], value_name="names") \
    .drop("variable", axis=1) \
    .dropna()
  
print(df_melt)


Python
# convert names series into string using str method
# split the string on basis of comma delimiter
# convert the series into list using to_list method
# use stack to finally convert list elements to rows
  
df_stack = pd.DataFrame(df.names.str.split(",").to_list(), index=df.id).stack()
df_stack = df_stack.reset_index(["id"])
df_stack.columns = ["id", "names"]
  
print(df_stack)


Python
# use explode to convert list elements to rows
df_explode = df.assign(names=df.names.str.split(",")).explode('names')
  
print(df_explode)


输出:

现在,让我们一步一步地探索这些方法。

方法一:使用Pandas的melt函数

首先,将每个名称字符串转换为一个列表。

Python

# assign the names series to a variable with 
# the same name and create a list column
df_melt = df.assign(names=df.names.str.split(","))
  
print(df_melt)

输出:

现在,拆分名称列列表值(创建具有单独列表值的列)。

Python

df_melt.names.apply(pd.Series)

将新列与数据集的其余部分合并。

Python

df_melt.names.apply(pd.Series) \
    .merge(df_melt, right_index = True, left_index = True)

删除旧的姓名列表列,然后使用melt函数将新列转换为单独的行。

Python

df_melt.names.apply(pd.Series) \
   .merge(df_melt, right_index = True, left_index = True) \
   .drop(["names"], axis = 1) \
   .melt(id_vars = ['id'], value_name = "names")

现在结合上述步骤。此外,还可以看到包含数字列 ID 的附加列“变量”。删除此列并删除空值。

Python

df_melt = df.assign(names=df.names.str.split(","))
df_melt = df_melt.names.apply(pd.Series) \
    .merge(df_melt, right_index=True, left_index=True) \
    .drop(["names"], axis=1) \
    .melt(id_vars=['id'], value_name="names") \
    .drop("variable", axis=1) \
    .dropna()
  
print(df_melt)

输出:

方法二:使用 Pandas 堆栈函数

将每个名称字符串转换为列表,然后使用 p和 stack()函数将列旋转到索引。

Python

# convert names series into string using str method
# split the string on basis of comma delimiter
# convert the series into list using to_list method
# use stack to finally convert list elements to rows
  
df_stack = pd.DataFrame(df.names.str.split(",").to_list(), index=df.id).stack()
df_stack = df_stack.reset_index(["id"])
df_stack.columns = ["id", "names"]
  
print(df_stack)

输出:

方法三:使用Pandas的explode函数

将每个名称字符串转换为列表,并使用 Pandas 爆炸()函数按每个元素拆分列表并为每个元素创建一个新行。

Python

# use explode to convert list elements to rows
df_explode = df.assign(names=df.names.str.split(",")).explode('names')
  
print(df_explode)

输出: