在Pandas中把列表式的列元素转换成独立的行
数据框架是一种表格结构,数据被安排在行和列中。在处理真实数据时,经常会遇到具有列表式元素的列。列表式意味着这些元素的形式可以很容易地转换为列表。在这篇文章中,我们将看到各种将列表式列元素转换为独立行的方法。
首先,让我们创建一个数据框架,我们将在所有的方法中使用。
# 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)
输出:

现在,让我们一步一步地探索这些方法。
方法1:使用Pandas熔化函数
首先,将每个名字的字符串转换为一个列表。
# 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)
输出:

现在,拆分名称列的列表值(具有单独列表值的列被创建)。
df_melt.names.apply(pd.Series)
将新列与数据集的其他部分合并。
df_melt.names.apply(pd.Series) \
.merge(df_melt, right_index = True, left_index = True)
丢掉旧的姓名列表列,然后用熔化函数将新的列转化为独立的行。
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")
现在结合上述步骤。同时,可以看到一个额外的列’variable’,包含数字列的id。这一列被删除,空值也被删除。
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)
输出:

方法2:使用Pandas堆栈函数
将每个名字的字符串转换为一个列表,然后使用p andas stack()函数对列进行透视,以获得索引。
# 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)
输出:

方法3:使用Pandas的explode函数
将每个名字的字符串转换成一个列表,并使用Pandas explode()函数按每个元素分割列表,为每个元素创建一个新行。
# use explode to convert list elements to rows
df_explode = df.assign(names=df.names.str.split(",")).explode('names')
print(df_explode)
输出:

极客教程