Python 将价值平均分配到所有的NaN中

Python 将价值平均分配到所有的NaN中,python,pandas,Python,Pandas,我有以下数据帧: var_value 2016-07-01 05:10:00 809.0 2016-07-01 05:15:00 NaN 2016-07-01 05:20:00 NaN 2016-07-01 05:25:00 NaN 2016-07-01 05:30:00 NaN 2016-07-01 05:35:00 NaN 2016-07-01 05:40:00

我有以下数据帧:

                     var_value
2016-07-01 05:10:00      809.0
2016-07-01 05:15:00        NaN
2016-07-01 05:20:00        NaN
2016-07-01 05:25:00        NaN
2016-07-01 05:30:00        NaN
2016-07-01 05:35:00        NaN
2016-07-01 05:40:00        NaN
2016-07-01 05:45:00        NaN
2016-07-01 05:50:00        NaN
2016-07-01 05:55:00        NaN
2016-07-01 06:00:00        NaN
2016-07-01 06:05:00        NaN
2016-07-01 06:10:00      185.0
2016-07-01 06:15:00        NaN
2016-07-01 06:20:00        NaN
2016-07-01 06:25:00        NaN
2016-07-01 06:30:00        NaN
2016-07-01 06:35:00        NaN
2016-07-01 06:40:00        NaN
2016-07-01 06:45:00        NaN
2016-07-01 06:50:00        NaN
2016-07-01 06:55:00        NaN
2016-07-01 07:00:00        NaN
2016-07-01 07:05:00        NaN
我想将809.0和185.0均匀地分布在各行中。因此,生成的数据帧应该如下所示:

               var_value
7/1/2016 5:10    67.42 
7/1/2016 5:15    67.42 
7/1/2016 5:20    67.42 
7/1/2016 5:25    67.42 
7/1/2016 5:30    67.42 
7/1/2016 5:35    67.42 
7/1/2016 5:40    67.42 
7/1/2016 5:45    67.42 
7/1/2016 5:50    67.42 
7/1/2016 5:55    67.42 
7/1/2016 6:00    67.42 
7/1/2016 6:05    67.42 
7/1/2016 6:10    15.42 
7/1/2016 6:15    15.42 
7/1/2016 6:20    15.42 
7/1/2016 6:25    15.42 
7/1/2016 6:30    15.42 
7/1/2016 6:35    15.42 
7/1/2016 6:40    15.42 
7/1/2016 6:45    15.42 
7/1/2016 6:50    15.42 
7/1/2016 6:55    15.42 
7/1/2016 7:00    15.42 
7/1/2016 7:05    15.42 
需要分布的已知值之间的行数(因此本例中的NAN)可能不同。在这种情况下,它是11个未知数,但可能是10个、3个或7个,等等

非常感谢您对解决此问题的任何帮助。

您可以先使用
NaN
值,然后用
len
除以:

比较解决方案:

len(df)=24

In [18]: %timeit (jez(df))
1000 loops, best of 3: 1.18 ms per loop

In [19]: %timeit (pir(df1))
100 loops, best of 3: 2.92 ms per loop
len(df)=24k

In [21]: %timeit (jez(df))
100 loops, best of 3: 7.49 ms per loop

In [22]: %timeit (pir(df1))
1 loop, best of 3: 590 ms per loop
计时代码:

#if need comapre 24k
#df = pd.concat([df]*1000).reset_index(drop=True)
df1 = df.copy()
def jez(df):
    df['var_value'] = df.var_value.ffill()
    df['var_value'] = df['var_value'] / df.groupby('var_value')['var_value'].transform(len)
    return df    

def pir(df):
    df = df.fillna(0).groupby(df.var_value.notnull().cumsum()).transform(lambda x: x.mean())
    return df    


print (jez(df))
print (pir(df1))
解释
  • df.notnull().cumsum()
    创建了一个系列,我可以用它来
    groupby

  • df.fillna(0)
    确保当我计算
    平均值时,
    NaN
    s包含为
    0

  • transform(lambda x:x.mean())
    计算组中每个元素的
    lambda
    函数

df.notnull.cumsum()


这应该是答案。不幸的是,我只能投你一票。我喜欢完整的时间代码张贴。我会开始的,谢谢。我很惊讶时间上的差异——首先,我认为它会非常相似。如果这个系列是[np.nan,3,3]?感谢这个解决方案有效。。。根据@jezrael所做的计时,我选择了这一个作为答案,因为它似乎更有表现力。
#if need comapre 24k
#df = pd.concat([df]*1000).reset_index(drop=True)
df1 = df.copy()
def jez(df):
    df['var_value'] = df.var_value.ffill()
    df['var_value'] = df['var_value'] / df.groupby('var_value')['var_value'].transform(len)
    return df    

def pir(df):
    df = df.fillna(0).groupby(df.var_value.notnull().cumsum()).transform(lambda x: x.mean())
    return df    


print (jez(df))
print (pir(df1))
df.fillna(0).groupby(df.notnull().cumsum()).transform(lambda x: x.mean())

2016-07-01 05:10:00    67.416667
2016-07-01 05:15:00    67.416667
2016-07-01 05:20:00    67.416667
2016-07-01 05:25:00    67.416667
2016-07-01 05:30:00    67.416667
2016-07-01 05:35:00    67.416667
2016-07-01 05:40:00    67.416667
2016-07-01 05:45:00    67.416667
2016-07-01 05:50:00    67.416667
2016-07-01 05:55:00    67.416667
2016-07-01 06:00:00    67.416667
2016-07-01 06:05:00    67.416667
2016-07-01 06:10:00    15.416667
2016-07-01 06:15:00    15.416667
2016-07-01 06:20:00    15.416667
2016-07-01 06:25:00    15.416667
2016-07-01 06:30:00    15.416667
2016-07-01 06:35:00    15.416667
2016-07-01 06:40:00    15.416667
2016-07-01 06:45:00    15.416667
2016-07-01 06:50:00    15.416667
2016-07-01 06:55:00    15.416667
2016-07-01 07:00:00    15.416667
2016-07-01 07:05:00    15.416667
Name: var_value, dtype: float64
2016-07-01 05:10:00    1
2016-07-01 05:15:00    1
2016-07-01 05:20:00    1
2016-07-01 05:25:00    1
2016-07-01 05:30:00    1
2016-07-01 05:35:00    1
2016-07-01 05:40:00    1
2016-07-01 05:45:00    1
2016-07-01 05:50:00    1
2016-07-01 05:55:00    1
2016-07-01 06:00:00    1
2016-07-01 06:05:00    1
2016-07-01 06:10:00    2
2016-07-01 06:15:00    2
2016-07-01 06:20:00    2
2016-07-01 06:25:00    2
2016-07-01 06:30:00    2
2016-07-01 06:35:00    2
2016-07-01 06:40:00    2
2016-07-01 06:45:00    2
2016-07-01 06:50:00    2
2016-07-01 06:55:00    2
2016-07-01 07:00:00    2
2016-07-01 07:05:00    2
Name: var_value, dtype: int64