【发布时间】:2021-09-28 10:21:39
【问题描述】:
我有两个相同的数组(嗯,带有索引的 pandas 数据框,但我认为该示例与数组保持一致),但其中一个散布有 nans。
例如:
a=[1,2,3,np.nan,4,5,np.nan,6,np.nan,7,np.nan,8,np.nan,9,10]
和
b=[1,2,3,4,5,6,7,8,9,10]
是否有一种简单(矢量化)的方式来重塑b,使其有效地变成a - nans 与a 在同一位置?
我知道这可能只是循环,如果是 nan,则将 nan 添加到另一个。但我想要一个比这更优雅的解决方案。 谢谢!
编辑。作为参考,这是针对statsmodels.api 的问题,其中.get_prediction() 返回置信区间数据和估计值,但去掉了 nans(稍后放回的索引),.predict() 给出了包含 nan 在内的真实索引的估计值.需要将这些合并在一起以获得新估计的置信区间。
如果有人正在寻找 statsmodels 和 statsmodels.api 之间 .get_prediction 差异的答案,其中 nans 被函数删除。以下代码有效(但需要包装到 pandas 中)。对不起,如果这个问题写得不好。希望对大家有所帮助,因为没有这方面的信息。
这是问题的答案。我不明白为什么它被关闭了。这是最好的解决方案。
def nan_merge(a,b):
indices = np.where(np.isnan(a))[0]
ans = np.insert(arr=b, obj=indices-list(range(len(indices))), values=np.nan)
return ans
def test_nan_merge():
a = np.array([1,2,3,np.nan,4,5,np.nan,6,np.nan,7,np.nan,8,np.nan,9,10])
b = np.array([1,2,3,4,5,6,7,8,9,10]).astype(float)
assert (nan_merge(a,b)==a).any()
pandas 的完全包装代码可能是这样的。不像下面提供的答案那么优雅,但会处理 pandas 合并解决方案无法解决的重复数字。
def get_true_indexes(data,model):
'''
Predict returns all indexes
Get prediction removes nans so destroys indexing.
But provides Low and high CI.
So lets merge them.
'''
def nan_merge(a,b):
indices = np.where(np.isnan(a))[0]
ans = np.insert(arr=b, obj=indices-list(range(len(indices))), values=np.nan)
return ans
def test_nan_merge():
a=np.array([1,2,3,np.nan,4,5,np.nan,6,np.nan,7,np.nan,8,np.nan,9,10])
b=np.array([1,2,3,4,5,6,7,8,9,10]).astype(float)
assert (nan_merge(a,b)==a).any()
df1=model.predict(data).copy(deep=True)
df1.name='predict'
df1=df1.to_frame()
df1=df1.reset_index()
df2= model.get_prediction(data).summary_frame()
real=df1['predict'].values
mea=df2['mean'].values
upp=df2['obs_ci_upper'].values
low=df2['obs_ci_lower'].values
if len(real)!=len(mea):
mea = nan_merge(real,mea)
upp= nan_merge(real,upp)
low= nan_merge(real,low)
ans=pd.DataFrame({'mean':mea,'obs_ci_upper':upp,'obs_ci_lower':low},index=df1['index'].to_list())
return ans
【问题讨论】:
-
b将始终具有与a中相同的元素,例如 1、2、3、4.. 就像在您的示例中一样? -
是的,它们的顺序相同,只是穿插了 nans。
-
呃....
b=a? ...听起来像 XY 问题... -
那你为什么不直接使用
a?如果目标是制作b == a. -
b 有一些额外的数据(在熊猫数据框中)在这种情况下我需要退出
标签: python pandas list numpy nan