我有两个相同的数组(好吧,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