【问题标题】:Insert Values into Pandas Dataframe backwards (High Index to low)将值向后插入 Pandas 数据帧(从高到低)
【发布时间】:2016-08-21 15:54:25
【问题描述】:

使用.fillna找到了解决方案

如你所料,我的标题已经很混乱了,我也是! 我有一个这样的数据框

Index         Values
 0             NaN
 1             NaN
...................
230            350.21
231            350.71
...................
1605           922.24

在 230 和 1605 之间我有值,但前 229 个条目没有。所以我计算了斜率以近似丢失的数据并将其存储在“斜率”中。

Y1 = df['Values'].min()
X1ID = df['Values'].idxmin()
Y2 = df['Values'].max()
X2ID = df['Values'].idxmax()
slope = (Y2 - Y1)/(X2ID - X1ID)

本质上,我想从 Values 中获取 .min,减去斜率并将新值插入到前一个 .min 之前的索引中。但是,我完全迷失了,我尝试了这样的事情:

 df['Values2'] = df['Values'].min().apply(lambda x: x.min() - slope) 

但这显然是垃圾。我将不胜感激一些建议

编辑

所以在尝试了多种方法后,我找到了一个至少对我有用的粗略解决方案。

loopcounter = 0
missingValue = []
missingindex = []
missingindex.append(loopcounter)
missingValue.append(Y1)
for minValue in missingValue:
    minValue = minValue-slopeave
    missingValue.append(minwavelength)
    loopcounter +=1
    missingindex.append(loopcounter)
    if loopcounter == 230:
         break
del missingValue[0]
missingValue.reverse()
del missingindex[-1]

首先我创建了两个列表,一个用于缺失值,另一个用于索引。 之后我将我的最小值 (Y1) 添加到列表中并开始我的循环。 我希望循环在 230 次后停止(缺失值的数量) 每个循环都会从列表中的项目中减去斜率,从最小值开始,同时将计数器添加到缺失索引列表中。

删除第一个值并颠倒顺序将列表转换为正确的顺序。

missValue = dict(zip(missingindex,missingValue))

然后我将这两个列表组合成一个字典

df['Values'] = df['Values'].fillna(missValue)

之后我使用 .fillna 函数用字典填充我的数据框。

这对我有用,我知道它可能不是最优雅的解决方案...

我要感谢所有投入时间帮助我的人,非常感谢。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    检查这个。但是,我觉得你必须把它作为一个循环,因为插入和最小计算必须重新计算

    import pandas as pd
    import numpy as np
    
    df = pd.DataFrame(columns=('Values',),data=
                        [
                            np.nan,
                            np.nan,
                            350.21,
                            350.71,
                            922.24
                        ])
    
    Y1 = df['Values'].min()
    X1ID = df['Values'].idxmin()
    Y2 = df['Values'].max()
    X2ID = df['Values'].idxmax()
    slope = (Y2 - Y1)/(X2ID - X1ID)
    
    line = pd.DataFrame(data=[Y1-slope], columns=('Values',), index=[X1ID])
    df2 = pd.concat([df.ix[:X1ID-1], line, df.ix[X1ID:]]).reset_index(drop=True)
    print df2
    

    这里提供了插入逻辑Is it possible to insert a row at an arbitrary position in a dataframe using pandas?

    【讨论】:

    • 感谢您的回复。它可能需要循环。我会调查的
    【解决方案2】:

    我认为您可以将locinterpolate 一起使用:

    print df
           Values
    Index        
    0         NaN
    1         NaN
    2         NaN
    3         NaN
    4         NaN
    5         NaN
    6         NaN
    229       NaN
    230    350.21
    231    350.71
    1605   922.24
    
    #add value 0 to index = 0
    df.at[0, 'Values'] = 0
    #add value Y1 - slope (349.793978) to max NaN value 
    df.at[X1ID-1, 'Values'] = Y1 - slope
    print df
               Values
    Index            
    0        0.000000
    1             NaN
    2             NaN
    3             NaN
    4             NaN
    5             NaN
    6             NaN
    229    349.793978
    230    350.210000
    231    350.710000
    1605   922.240000
    
    print df.loc[0:X1ID-1, 'Values']
    Index
    0        0.000000
    1             NaN
    2             NaN
    3             NaN
    4             NaN
    5             NaN
    6             NaN
    229    349.793978
    Name: Values, dtype: float64
    
    #filter values by indexes and interpolate
    df.loc[0:X1ID-1, 'Values'] = df.loc[0:X1ID-1, 'Values'].interpolate(method='linear')
    print df
               Values
    Index            
    0        0.000000
    1       49.970568
    2       99.941137
    3      149.911705
    4      199.882273
    5      249.852842
    6      299.823410
    229    349.793978
    230    350.210000
    231    350.710000
    1605   922.240000
    

    【讨论】:

    • 这在技术上似乎可行,但不知何故不是预期值,它似乎下降得非常快。遗憾的是,坡度只能在更长的范围内计算,因为它更像楼梯而不是严格线性的。
    • 也许尝试改变interpolate方法。
    【解决方案3】:

    我会稍微修改一下:

    df['Values2'] = df['Values']
    df.ix[df.Values2.isnull(), 'Values2'] = (Y1 - slope)
    

    编辑

    或者试着把它放在一个像下面这样的循环中。这将递归地填充所有值,直到它到达系列的末尾:

    def fix_rec(series):
        Y1 = series.min()
        X1ID = series.idxmin() ##; print(X1ID)
        Y2 = series.max()
        X2ID = series.idxmax()
        slope = (Y2 - Y1) / (X2ID - X1ID);
    
        if X1ID == 0: ## termination condition
            return series
    
        series.loc[X1ID-1] = Y1 - slope
    
        return fix_rec(series)
    

    这样称呼它:

    df['values2'] = df['values']
    fix_rec(df.values2)
    

    希望对你有帮助!

    【讨论】:

    • 感谢您的建议。现在我们为所有 229 个条目获得相同的值,但它们应该越接近 0 越减少。也许我们需要循环,因为从技术上讲,值 (y1) 的 .min 应该在每次减法后始终是一个新值。
    猜你喜欢
    • 2023-04-04
    • 2019-10-11
    • 2019-12-16
    • 2017-04-06
    • 2019-03-28
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    相关资源
    最近更新 更多