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)
平均值时,
s包含为NaN
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