panda将列拆分成多列
在 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:使用 apply
和 DataFrame
构造函数
可以使用 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