【问题标题】:How to align two python arrays with the same values but nans in one [closed]如何将两个具有相同值但 nans 的 python 数组对齐[关闭]
【发布时间】: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


【解决方案1】:

如果a和b中的值是唯一的,你可以对b的dataframe的原始索引进行合并排序,得到你想要的。

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

【讨论】:

  • 这很好用。感谢您的解决方案。但是,是的,我似乎有一些罕见的重复。我通过df3=df3.drop('index',axis=1)df3=df3[(~df3.duplicated()) | (df3['mean'].isnull())] 处理这个问题,但仍然不是一个完美的解决方案。我打算将您标记为正确,但是由于此限制,我可能会等待更长时间,看看是否可以在此解决方案的基础上进行构建。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多