pandas转宽格式后出现NaN重复行 如何按Time-Parameter去重计算
pandas按Time-Parameter配对合并有效值并计算乘积的实现
你的原始数据中同一Time+Parameter组合下,NodeA和NodeB的有效值分散在不同行、空值错位,直接按两个维度分组聚合提取非空值再计算乘积即可,无需手动逐行去重。
实现步骤
- 第一步:预处理数据,将字符串格式的数值和'NaN'转为浮点型数值与真实空值,方便后续计算
import pandas as pd import numpy as np # 读取原始数据 df = pd.DataFrame({ 'Time':['0', '1', '0', '1','0', '1','0', '1'], 'Parameter':['down_A', 'down_A', 'up_A','up_A','down_A', 'down_A', 'up_A','up_A'], 'NodeA':['2.56', '0.06', '0.14', '1.005','NaN', 'NaN', 'NaN','NaN'], 'NodeB':['NaN', 'NaN','NaN', 'NaN', '1.44', '1.11','0.56','1.98'] }) # 数值列类型转换 df[['NodeA', 'NodeB']] = df[['NodeA', 'NodeB']].replace('NaN', np.nan).astype(float)
- 第二步:按
Time和Parameter分组,提取每组内NodeA、NodeB的第一个非空值。当前示例中每组两个列各自仅有1个有效数值,其余全为空值,用first()即可准确提取到有效值
result = df.groupby( ['Time', 'Parameter'], as_index=False )[['NodeA', 'NodeB']].first()
- 第三步:计算两列的乘积,生成
Multiplied列
result['Multiplied'] = result['NodeA'] * result['NodeB']
结果验证
运行代码后得到的result完全匹配预期输出,结构如下:
Time Parameter NodeA NodeB Multiplied 0 0 down_A 2.560 1.44 3.6864 1 0 up_A 0.140 0.56 0.0784 2 1 down_A 0.060 1.11 0.0666 3 1 up_A 1.005 1.98 1.9899
补充说明:如果实际业务中同一Time-Parameter组内存在多个非空值,可以根据需求将
first()替换为sum()、mean()、max()等聚合函数,分组聚合的方式比手动删重行稳定性更高,不会因为行顺序变动导致取值错误。
内容的提问来源于stack exchange,提问作者Rina
相关产品推荐
相关产品推荐

