likes
comments
collection
share

panda将列拆分成多列

作者站长头像
站长
· 阅读数 29

在 Pandas 中,将一个包含多个元素的返回值拆分成多个列,并不是唯一的方法,但将返回值转化成 pd.Series 是一种常用且方便的方法。这是因为 pd.Series 对象可以直接映射到数据框的列。

然而,还有其他方法也可以实现同样的效果。以下是一些替代方法,每种方法都有其优点和适用场景。

方法1:使用 pd.Series

通过将元组转换为 pd.Series,可以方便地拆分成多个列。

import pandas as pd
import re

# 示例数据
data = {
    'range': ['1千-3千', '小于1千', '大于2万', '5千-1万']
}

df = pd.DataFrame(data)

# 定义一个函数来提取最小值和最大值
def extract_min_max(range_str):
    if '小于' in range_str:
        min_val = 0
        max_val = int(re.search(r'\d+', range_str).group()) * 1000
    elif '大于' in range_str:
        min_val = int(re.search(r'\d+', range_str).group()) * 10000
        max_val = float('inf')
    else:
        values = re.findall(r'\d+', range_str)
        min_val = int(values[0]) * 1000
        max_val = int(values[1]) * 1000
    return min_val, max_val

# 使用apply方法应用函数,并将结果拆分成两列
df[['min_value', 'max_value']] = df['range'].apply(lambda x: pd.Series(extract_min_max(x)))

# 将类型转换为整数类型
df['min_value'] = df['min_value'].astype(int)
df['max_value'] = df['max_value'].replace(float('inf'), pd.NA).astype(pd.Int64Dtype())

print(df)

方法2:使用 applyDataFrame 构造函数

可以使用 apply 方法生成一个包含元组的列,然后将这一列转化为数据框,再将其合并到原数据框中。

# 使用apply方法生成一个包含元组的列
df['min_max'] = df['range'].apply(extract_min_max)

# 将包含元组的列转换为数据框
min_max_df = pd.DataFrame(df['min_max'].tolist(), columns=['min_value', 'max_value'])

# 将新的数据框合并到原数据框中
df = pd.concat([df, min_max_df], axis=1).drop(columns=['min_max'])

# 将类型转换为整数类型
df['min_value'] = df['min_value'].astype(int)
df['max_value'] = df['max_value'].replace(float('inf'), pd.NA).astype(pd.Int64Dtype())

print(df)

方法3:直接拆分返回值

直接在 apply 方法中拆分返回的元组,并赋值给多个新列。

# 使用apply方法直接拆分元组,并赋值给多个新列
df['min_value'], df['max_value'] = zip(*df['range'].apply(extract_min_max))

# 将类型转换为整数类型
df['min_value'] = df['min_value'].astype(int)
df['max_value'] = df['max_value'].replace(float('inf'), pd.NA).astype(pd.Int64Dtype())

print(df)

方法4:使用列表推导

通过列表推导将原数据框的每一行转换成所需的格式,并生成一个新的数据框。

# 使用列表推导生成包含最小值和最大值的列表
min_max_list = [extract_min_max(x) for x in df['range']]

# 将列表转换为数据框,并合并到原数据框中
min_max_df = pd.DataFrame(min_max_list, columns=['min_value', 'max_value'])
df = pd.concat([df, min_max_df], axis=1)

# 将类型转换为整数类型
df['min_value'] = df['min_value'].astype(int)
df['max_value'] = df['max_value'].replace(float('inf'), pd.NA).astype(pd.Int64Dtype())

print(df)

总结

将返回值转化成 pd.Series 是拆分多元素返回值到多个列的一种常见方法,但并不是唯一的方法。可以根据具体情况选择最合适的方法,例如直接拆分返回值、使用列表推导、或者将包含元组的列转换为数据框再合并到原数据框中。这些方法都可以有效地实现同样的目标。

转载自:https://juejin.cn/post/7372441501609099290
评论
请登录