微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python – Pandas Dataframe在由索引分隔的部分中进行插值

我的示例代码如下:

import pandas as pd


dictx = {'col1':[1,'nan','nan','nan',5,'nan',7,'nan',9,'nan','nan','nan',13],\
    'col2':[20,'nan','nan','nan',22,'nan',25,'nan',30,'nan','nan','nan',25],\
    'col3':[15,'nan','nan','nan',10,'nan',14,'nan',13,'nan','nan','nan',9]}
df = pd.DataFrame(dictx).astype(float)

我正在尝试插入包含值’nan’的各个段.
对于上下文,我试图使用城市(巴西圣保罗)提供的GPS数据来跟踪公交车的速度,但数据很少,并且部分不提供信息,例如,但是有一些细分市场我知道他们被阻止了,比如黎明,但信息也是“南”.

我需要的:
我一直在尝试使用dataframe.interpolate()参数(limit和limit_diretcion),但是很简单.如果我设置df.interpolate(limit = 2),我不仅会插入我需要的数据,还会插入不应该的数据.所以我需要在限制定义的部分之间进行插值

期望的输出

Out[7]: 
    col1   col2   col3
0    1.0  20.00  15.00
1    nan  nan    nan
2    nan  nan    nan
3    nan  nan    nan
4    5.0  22.00  10.00
5    6.0  23.50  12.00
6    7.0  25.00  14.00
7    8.0  27.50  13.50
8    9.0  30.00  13.00
9    nan  nan    nan
10   nan  nan    nan
11   nan  nan    nan
12   13.0 25.00  9.00

我一直试图应用的逻辑基本上是试图找到nan并计算它们的索引之间的差异,因此创建一个新的dataframe_temp进行插值,而不是将其添加到另一个创建新的dataframe_final.但由于’nan’==’nan’返回False,这已经变得难以实现

解决方法:

这是一个黑客,但可能仍然有用.可能Pandas 0.23将有更好的解决方案.

https://pandas-docs.github.io/pandas-docs-travis/whatsnew.html#dataframe-interpolate-has-gained-the-limit-area-kwarg

df_fw = df.interpolate(limit=1)
df_bk = df.interpolate(limit=1, limit_direction='backward')

df_fw.where(df_bk.notna())

    col1  col2  col3
0    1.0  20.0  15.0
1    NaN   NaN   NaN
2    NaN   NaN   NaN
3    NaN   NaN   NaN
4    5.0  22.0  10.0
5    6.0  23.5  12.0
6    7.0  25.0  14.0
7    8.0  27.5  13.5
8    9.0  30.0  13.0
9    NaN   NaN   NaN
10   NaN   NaN   NaN
11   NaN   NaN   NaN
12  13.0  25.0   9.0

不是哈克
更合理的处理方式.
广义处理任何限制.

def interp(df, limit):
    d = df.notna().rolling(limit + 1).agg(any).fillna(1)
    d = pd.concat({
        i: d.shift(-i).fillna(1)
        for i in range(limit + 1)
    }).prod(level=1)

    return df.interpolate(limit=limit).where(d.astype(bool))

df.pipe(interp, 1)

    col1  col2  col3
0    1.0  20.0  15.0
1    NaN   NaN   NaN
2    NaN   NaN   NaN
3    NaN   NaN   NaN
4    5.0  22.0  10.0
5    6.0  23.5  12.0
6    7.0  25.0  14.0
7    8.0  27.5  13.5
8    9.0  30.0  13.0
9    NaN   NaN   NaN
10   NaN   NaN   NaN
11   NaN   NaN   NaN
12  13.0  25.0   9.0

也可以处理从列到列的NaN变化.考虑一个不同的df

dictx = {'col1':[1,'nan','nan','nan',5,'nan','nan',7,'nan',9,'nan','nan','nan',13],\
    'col2':[20,'nan','nan','nan',22,'nan',25,'nan','nan',30,'nan','nan','nan',25],\
    'col3':[15,'nan','nan','nan',10,'nan',14,'nan',13,'nan','nan','nan',9,'nan']}
df = pd.DataFrame(dictx).astype(float)
df

    col1  col2  col3
0    1.0  20.0  15.0
1    NaN   NaN   NaN
2    NaN   NaN   NaN
3    NaN   NaN   NaN
4    5.0  22.0  10.0
5    NaN   NaN   NaN
6    NaN  25.0  14.0
7    7.0   NaN   NaN
8    NaN   NaN  13.0
9    9.0  30.0   NaN
10   NaN   NaN   NaN
11   NaN   NaN   NaN
12   NaN   NaN   9.0
13  13.0  25.0   NaN

然后使用limit = 1

df.pipe(interp, 1)

    col1  col2  col3
0    1.0  20.0  15.0
1    NaN   NaN   NaN
2    NaN   NaN   NaN
3    NaN   NaN   NaN
4    5.0  22.0  10.0
5    NaN  23.5  12.0
6    NaN  25.0  14.0
7    7.0   NaN  13.5
8    8.0   NaN  13.0
9    9.0  30.0   NaN
10   NaN   NaN   NaN
11   NaN   NaN   NaN
12   NaN   NaN   9.0
13  13.0  25.0   9.0

并且限制= 2

df.pipe(interp, 2).round(2)

     col1   col2  col3
0    1.00  20.00  15.0
1     NaN    NaN   NaN
2     NaN    NaN   NaN
3     NaN    NaN   NaN
4    5.00  22.00  10.0
5    5.67  23.50  12.0
6    6.33  25.00  14.0
7    7.00  26.67  13.5
8    8.00  28.33  13.0
9    9.00  30.00   NaN
10    NaN    NaN   NaN
11    NaN    NaN   NaN
12    NaN    NaN   9.0
13  13.00  25.00   9.0

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐