使用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
相关产品推荐
相关产品推荐

