gpt4 book ai didi

python-3.x - Pandas 用最接近的非数字值进行插值

转载 作者:行者123 更新时间:2023-12-03 16:44:21 26 4
gpt4 key购买 nike

我有一个带有日期时间索引的数字和非数字值的数据框:

df = pd.DataFrame([
{'date': datetime(2017, 4, 24, 1), 'a':1, 'b':2, 'c': "hee"},
{'date': datetime(2017, 4, 24, 2), 'a':2, 'b':4, 'c': 'hoo'},
{'date': datetime(2017, 4, 24, 3), 'a':4, 'b':8, 'c': 'joo'},
{'date': datetime(2017, 4, 24, 4), 'a':8, 'b':16, 'c': 'jee'}
]).set_index('date')

我想要:
  • 线性插值数值;和
  • 获取非数字值的最接近值。

  • 什么是最优雅的实现?

    策略一

    插入所有,然后 fillna :
    df = df.resample('20T').interpolate('linear')
    df.fillna(method='nearest')

    但是... nearest 方法未实现。

    策略二

    拆分数字和非数字列
    df2 = df.resample('20T')
    df_a = df2._get_numeric_data().interpolate('linear')
    df_b = df2[list(set(df.columns) - set(set(df_a.columns)))].interpolate('nearest')

    这给出了一个错误:

    TypeError: Cannot interpolate with all NaNs.



    更新

    使用最近的方法进行插值确实适用于 bool 值和数值,但不适用于字符串,例如:
    df.resample('20T').intepolate('nearest')

    最佳答案

    interpolate("nearest")适用于数字类型,解决方案是:

  • 转换您的列字符串到分类 (这是数字)
  • 插值分类列与 interpolate("nearest")
  • 映射回字符串 插值分类列
    def fillna_nearest(series):
    fact = series.astype('category').factorize()

    series_cat = pd.Series(fact[0]).replace(-1, np.nan) # get string as categorical (-1 is NaN)
    series_cat_interp = series_cat.interpolate("nearest") # interpolate categorical

    cat_to_string = {i:x for i,x in enumerate(fact[1])} # dict connecting category to string
    series_str_interp = series_cat_interp.map(cat_to_string) # turn category back to string

    return series_str_interp


    In [10]: df.resample('20T').interpolate().apply(fillna_nearest)
    Out[10]:
    a b c
    0 1.000000 2.000000 hee
    1 1.333333 2.666667 hee
    2 1.666667 3.333333 hoo
    3 2.000000 4.000000 hoo
    4 2.666667 5.333333 hoo
    5 3.333333 6.666667 joo
    6 4.000000 8.000000 joo
    7 5.333333 10.666667 joo
    8 6.666667 13.333333 jee
    9 8.000000 16.000000 jee
  • 关于python-3.x - Pandas 用最接近的非数字值进行插值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43586058/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com