如何将CSV文件中的上下深度区间转换为固定采样率的单列数据
解决CSV区间展开为0.5步长序列的问题
我来帮你搞定这个需求!你想要把CSV里的数值区间(Top到Bottom)按0.5的步长展开成连续序列,同时填充对应Value,空缺位置设为Nan对吧?先说说你现有代码的问题:你把Value设为索引后执行stack操作,这只是把原数据的列转成行,完全没生成我们需要的连续数值序列,所以达不到目标。
下面是正确的实现步骤和代码:
步骤1:读取原始数据
首先正确读取CSV文件,注意列名的大小写(原CSV里是Value,不是小写的value):
import pandas as pd # 读取你的CSV文件 df = pd.read_csv('D:\\Range.csv')
步骤2:生成完整的Top序列
我们需要生成从最小的Top值到最大的Bottom值,步长为0.5的所有数值:
# 获取数值范围的边界 min_top = df['Top'].min() max_bottom = df['Bottom'].max() # 生成完整的Top序列,步长0.5 full_top = pd.DataFrame({'Top': pd.arange(min_top, max_bottom + 0.5, 0.5)})
步骤3:匹配每个数值对应的Value
接下来我们要判断每个生成的Top值属于哪个原始区间,然后填充对应的Value,没有匹配到的就设为Nan:
# 定义一个函数,用来匹配每个Top值对应的Value def match_value(row): # 找到满足「原始Top ≤ 当前Top ≤ 原始Bottom」的行 matched_row = df[(df['Top'] <= row['Top']) & (df['Bottom'] >= row['Top'])] if not matched_row.empty: return matched_row['Value'].iloc[0] else: return pd.NA # 如果你用的是旧版pandas,可以换成np.nan # 把函数应用到full_top的每一行 full_top['Value'] = full_top.apply(match_value, axis=1)
步骤4:查看结果
现在打印full_top就能得到你想要的输出了:
print(full_top)
更高效的实现方式(用IntervalIndex)
如果你的数据量比较大,上面的apply方法可能有点慢,我们可以用pandas的IntervalIndex来快速匹配区间:
# 为原始数据创建区间索引 df['interval'] = pd.IntervalIndex.from_arrays(df['Top'], df['Bottom'], closed='both') # 快速匹配每个Top值对应的Value full_top['Value'] = full_top['Top'].apply( lambda x: df[df['interval'].contains(x)]['Value'].iloc[0] if any(df['interval'].contains(x)) else pd.NA )
运行这段代码后,你就能得到和预期完全一致的输出啦!
内容的提问来源于stack exchange,提问作者Mohamed Hassan
相关产品推荐
相关产品推荐

