Python Pandas如何仅复制列名行索引到新DataFrame不携带原始数据
Pandas 生成目标空DataFrame及逐小时变化率计算方案
报错原因说明
你运行代码报错的原因是pd.DataFrame.rename()的index参数要求传入索引旧值到新值的映射字典或可调用对象,你直接传入列名的Index对象,Pandas尝试将其作为可调用对象执行,因此抛出'Index' object is not callable错误,且该段代码逻辑也不符合生成目标空DataFrame的需求。
空output_data生成方法
以下方案性能可轻松支撑数千条数据的处理需求,生成的output_data和原data列名一致、保留Name列的全部取值,其余数值列留空可供后续填充:
import pandas as pd # 方式1:拷贝原data结构后清空数值列,适合需要保留原数据索引的场景 output_data = data.copy() # 除Name列外其余列置为空值,也可根据需求替换为空字符串'' output_data.loc[:, output_data.columns != 'Name'] = pd.NA # 方式2:轻量生成新DataFrame,无需拷贝原数值,内存占用更低 output_data = pd.DataFrame(columns=data.columns) output_data['Name'] = data['Name']
直接计算逐小时变化率的参考实现
如果你不需要提前留空,可以直接通过以下代码一步得到示例中的最终output_data结果:
# 提取所有数值列(排除Name列) value_cols = data.columns.drop('Name') # 按行计算环比变化率,乘以100转为百分比数值 pct_data = data[value_cols].pct_change(axis=1, fill_method=None) * 100 # 首个时间节点的变化率固定为0% pct_data.iloc[:, 0] = 0 # 格式化为带正负号的百分比字符串,拼接Name列得到最终结果 output_data = data[['Name']].join(pct_data.applymap(lambda x: f"{x:+g}%" if pd.notna(x) else ""))
内容的提问来源于stack exchange,提问作者dmsokol13
相关产品推荐
相关产品推荐

