You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用np.where计算后如何保留DataFrame的列名与索引名?

解决DataFrame条件计算后丢失列名和日期的问题

我明白你遇到的困扰了——用np.where生成数组后转成DataFrame,原有的列名和日期信息全没了,变成了默认的整数索引。其实有两种简单的方法可以解决这个问题,既能完成条件计算,又完美保留原表的结构:

方法一:直接在DataFrame层面操作(更简洁直观)

不用绕去numpy数组,直接在原DataFrame的副本上做条件赋值,天然就能保留所有结构信息:

import pandas as pd
import numpy as np

# 你的原始数据
dailyRtn = pd.DataFrame([["2017-12-25", 0.069392, 0.124916, 0.119108], ["2017-12-26", 0.020000, 0.100000, 0.080000], ["2017-12-27", 1.000000, 1.200000, 1.500000]], columns = ["date", "A", "B", "C"])
averageofP = pd.DataFrame([["2017-12-25", 0.059392, 0.894916, 0.419108], ["2017-12-26", 0.021000, 0.100000, 0.990000], ["2017-12-27", 1.500000, 1.100000, 1.800000]], columns = ["date", "A", "B", "C"])

# 复制原表的完整结构
downsideDev = dailyRtn.copy()
# 只对数值列应用条件:当dailyRtn不小于averageofP时,设为空字符串
downsideDev[['A', 'B', 'C']] = np.where(dailyRtn[['A', 'B', 'C']] < averageofP[['A', 'B', 'C']], dailyRtn[['A', 'B', 'C']], "")

这样得到的downsideDev会完全保留原表的date列、A/B/C列名和行索引,和你想要的结构一模一样。

方法二:用np.where后手动指定结构信息

如果你一定要用numpy的np.where生成数组,那在转成DataFrame的时候,手动传入原表的列名和索引即可:

# 提取需要计算的数值列(排除date列)
numeric_cols = dailyRtn.columns[1:]
# 生成条件计算后的数组
result_array = np.where(dailyRtn[numeric_cols] < averageofP[numeric_cols], dailyRtn[numeric_cols], "")
# 创建DataFrame时指定列名和行索引,再把date列插回第一位
downsideDev = pd.DataFrame(result_array, columns=numeric_cols, index=dailyRtn.index)
downsideDev.insert(0, 'date', dailyRtn['date'])

为什么你的原始方法会丢失信息?

因为np.where返回的是纯numpy数组,它不包含任何列名、索引或日期这类元数据。当你直接用这个数组创建DataFrame时,pandas会默认用整数作为列名和行索引,所以原表的结构信息就丢失了——只要在创建DataFrame时手动指定columns和index参数,就能找回这些信息。

内容的提问来源于stack exchange,提问作者Alexander Thomsen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:53:26