在 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)
输出: