簡體   English   中英

如何在操作中使用先前的值填充NaN值?

[英]How fill NaN values with previous values in a operation?

我有一個這樣的數據幀:

name   value   variation
A      2       0.97
B      3       1.2
C      NaN     1.1
D      NaN     0.8
E      NaN     0.87
F      4       1.1

我需要使用上一行執行value * variation來填充這些NaN值

name   value   variation
A      2       0.97
B      3       1.2
C      3.6     1.1   >> 3*1.2
D      3.96    0.8   >> 3.6*1.1
E      3.16    0.87  >> 3.96*0.8
F      4       1.1

我認為有一種有效的方法可以做到這一點,但我無法在stackoverflow中找到相關的問題。

謝謝!

使用:

#create 2 groups of NaNs for better sample data
df = pd.concat([df] * 2, ignore_index=True)

#create mask by missing value and one non missing value before
m = df['value'].isna() | df['value'].isna().shift(-1).fillna(False)
#create groups by consecutive Trues
g = m.ne(m.shift()).cumsum()[m]
#use cumprod per groups, shift and multiple by forward filling value
s = df['variation'].groupby(g).cumprod().shift() * df['value'].ffill()
#replace missing values by Series s
df['value'] = df['value'].fillna(s)
print (df)
   name  value  variation
0     A  2.000       0.97
1     B  3.000       1.20
2     C  3.600       1.10
3     D  3.960       0.80
4     E  3.168       0.87
5     F  4.000       1.10
6     A  2.000       0.97
7     B  3.000       1.20
8     C  3.600       1.10
9     D  3.960       0.80
10    E  3.168       0.87
11    F  4.000       1.10

這使用pandas版本0.25.1工作:

import pandas as pd
import numpy as np

df = pd.DataFrame({'name':['A','B','C','D','E','F'], 'value':[2,3,np.NaN, np.NaN, np.NaN, 4],'variation':[0.97,1.2,1.1,0.8,0.87,1.1]})

df['value_ffill'] = df['value'].fillna(method='ffill')

df['value'].fillna(df['value_ffill']*df['variation'], inplace=True)

df.drop(columns=['value_ffill'], inplace=True)

print(df)

#   name  value  variation
# 0    A   2.00       0.97
# 1    B   3.00       1.20
# 2    C   3.30       1.10
# 3    D   2.40       0.80
# 4    E   2.61       0.87
# 5    F   4.00       1.10

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM