在Pandas中把列表式的列元素转换成独立的行

在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)

输出:

在Pandas中把列表式的列元素转换成独立的行

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

方法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)

输出:

在Pandas中把列表式的列元素转换成独立的行

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

df_melt.names.apply(pd.Series)

在Pandas中把列表式的列元素转换成独立的行

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

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

在Pandas中把列表式的列元素转换成独立的行

丢掉旧的姓名列表列,然后用熔化函数将新的列转化为独立的行。

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")

在Pandas中把列表式的列元素转换成独立的行

现在结合上述步骤。同时,可以看到一个额外的列’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)

输出:

在Pandas中把列表式的列元素转换成独立的行

方法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)

输出:

在Pandas中把列表式的列元素转换成独立的行

方法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)

输出:

在Pandas中把列表式的列元素转换成独立的行

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程