Pandas 用重复索引按比例插值

Pandas 用重复索引按比例插值,pandas,numpy,Pandas,Numpy,我有一张像这样的桌子 df=pd.DataFrame([1,np.nan,3,1,np.nan,3,50,np.nan,52],index=[7,8,9,7,12,27,7,8,9]): 行已正确排序。然而,这里的索引不是有序的,并且设计有重复项 如何在此处按索引比例插入值(method=“index”) 如果我尝试使用索引进行插值,结果序列会因为重复索引而混乱: df.interpolate(method='index'): 所需的实际索引值 7 1 1 1

我有一张像这样的桌子
df=pd.DataFrame([1,np.nan,3,1,np.nan,3,50,np.nan,52],index=[7,8,9,7,12,27,7,8,9])

行已正确排序。然而,这里的索引不是有序的,并且设计有重复项

如何在此处按索引比例插入值(method=“index”)

如果我尝试使用索引进行插值,结果序列会因为重复索引而混乱:
df.interpolate(method='index')

所需的实际索引值
7      1       1        1
8南2 2
9      3       3        3
7      1       1        1

12 NaN 1.5 52尝试根据索引为数据帧添加分组:

df.groupby(df.index.to_series().diff().lt(0).cumsum())\
  .apply(lambda x: x.interpolate(method='index'))
输出:

       0
7    1.0
8    2.0
9    3.0
7    1.0
12   1.5
27   3.0
7   50.0
8   51.0
9   52.0

尝试根据索引向数据帧添加分组:

df.groupby(df.index.to_series().diff().lt(0).cumsum())\
  .apply(lambda x: x.interpolate(method='index'))
输出:

       0
7    1.0
8    2.0
9    3.0
7    1.0
12   1.5
27   3.0
7   50.0
8   51.0
9   52.0

更复杂的方法是,若你们有我在斯科特的评论中提到的情况

np.where(df['values'].isnull(),df['values'].shift()+(df['values'].shift(-1)-df['values'].shift())*(df['index']-df['index'].shift())/(df['index'].shift(-1)-df['index'].shift()),df['values'])
Out[219]: array([ 1. ,  2. ,  3. ,  1. ,  1.5,  3. , 50. , 51. , 52. ])
这是为了检查两个有效值之间每个空值的距离,并用索引的距离(不同)填充该值


容差:两个值之间只缺少一个值

如果您遇到类似我在scott评论中提到的情况,情况会更复杂

np.where(df['values'].isnull(),df['values'].shift()+(df['values'].shift(-1)-df['values'].shift())*(df['index']-df['index'].shift())/(df['index'].shift(-1)-df['index'].shift()),df['values'])
Out[219]: array([ 1. ,  2. ,  3. ,  1. ,  1.5,  3. , 50. , 51. , 52. ])
这是为了检查两个有效值之间每个空值的距离,并用索引的距离(不同)填充该值


公差:两个值之间只缺少一个值

如何更改重复不总是像1 2 3 2 3 4 1 2那样增加索引3@Wen我们应该也可以创建组。只是觉得这很难没有循环,也许我们应该考虑1,2,3,2,3,4,9,10。11@Wen我同意你的看法,在这种情况下,可能需要一个循环。希望您可以控制输入上的索引。:)仍然是一个很好的方法:-)如何改变重复并不总是像1 2 3 2 3 4 1 2那样增加索引3@Wen我们应该也可以创建组。只是觉得这很难没有循环,也许我们应该考虑1,2,3,2,3,4,9,10。11@Wen我同意你的观点,在这种情况下可能需要一个循环。希望您可以控制输入上的索引。:)还是一个不错的方法:-)