如何将两个值相同但nans为一的python数组对齐



我有两个相同的数组(好吧,pandas数据帧带有索引,但我认为这个例子对数组保持不变(,但其中一个数组中穿插了nan。

例如:

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()返回置信区间数据和估计,但去掉nan(稍后重新组合的索引(,.predict()给出了包含nan在内的真实索引的esimate。需要将这些因素放在一起,以获得新估计的置信区间。

如果有人在寻找statsmodels和statsmodels.api之间.get_prediction中差异的答案,其中nan被函数删除。以下代码有效(但需要封装到panda中(。如果这个问题写得不好,我很抱歉。希望能帮助人们,因为目前还没有这方面的信息。

这就是问题的答案。我不明白为什么它被关闭了。这是最好的解决方案。

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()

熊猫的完全封装代码可能是这样的。没有下面提供的答案那么优雅,但将处理熊猫合并解决方案无法解决的重复数字。

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

如果a和b中的值是唯一的,则可以对b的数据帧的原始索引进行合并和排序,以获得所需的内容。

df1 = pd.DataFrame({'a':['A', 'B', 'C', 'D']})
df2 = pd.DataFrame({'b':['A', np.nan, 'B', np.nan, 'C', 'D'], 'other column':[1, 2, 3, 4, 5, 6]})
df2 = df2.reset_index()
df3 = df1.merge(df2, left_on='a', right_on='b', how='outer')
df3 = df3.sort_values(by='index')

获取df3:

a  index    b  other column
0    A      0    A             1
4  NaN      1  NaN             2
1    B      2    B             3
5  NaN      3  NaN             4
2    C      4    C             5
3    D      5    D             6

最新更新