如何基于两个序列的范围在Pandas中生成新行?
解决Pandas生成区间采样并扩展行的问题
需求说明
你有如下初始DataFrame,需要针对每个CLASS的TOP和BOT值生成指定数量的区间采样,并将这些采样值扩展为新行,保留对应ID和CLASS信息:
import pandas as pd import numpy as np df = pd.DataFrame({"ID":[1, 1], "CLASS":["A","B"], "TOP":[12.4, 29.1], "BOT":[29.1, 32.8]})
实现代码
可以通过apply遍历每行生成采样序列,再合并为最终DataFrame:
# 设置统一采样数量 n_samples = 5 # 生成采样并扩展行 result = df.apply( lambda row: pd.DataFrame({ "ID": [row["ID"]] * n_samples, "CLASS": [row["CLASS"]] * n_samples, "VALUE": np.linspace(row["TOP"], row["BOT"], n_samples) }), axis=1 ).concat().reset_index(drop=True) print(result)
输出结果
执行后会得到如下结构的DataFrame:
ID CLASS VALUE 0 1 A 12.400 1 1 A 16.575 2 1 A 20.750 3 1 A 24.925 4 1 A 29.100 5 1 B 29.100 6 1 B 30.025 7 1 B 30.950 8 1 B 31.875 9 1 B 32.800
灵活调整(按CLASS设置不同采样数)
如果需要给不同CLASS设置不同采样数,可先给原DataFrame新增采样数列,再修改apply逻辑:
# 给每个CLASS指定采样数 df["SAMPLE_NUM"] = [5, 3] # 按行指定采样数生成结果 result_custom = df.apply( lambda row: pd.DataFrame({ "ID": [row["ID"]] * row["SAMPLE_NUM"], "CLASS": [row["CLASS"]] * row["SAMPLE_NUM"], "VALUE": np.linspace(row["TOP"], row["BOT"], row["SAMPLE_NUM"]) }), axis=1 ).concat().reset_index(drop=True) print(result_custom)
这段代码会给CLASS A生成5个采样,CLASS B生成3个采样,满足你“无需每个CLASS都保留5个采样”的需求。
内容的提问来源于stack exchange,提问作者user026
相关产品推荐
相关产品推荐

