Python 根据上一个可用值和下一个可用值填充NaN
我有如下csv数据:Python 根据上一个可用值和下一个可用值填充NaN,python,pandas,Python,Pandas,我有如下csv数据: A B 0 x aa 1 z aa 2 3 4 x aa 5 z bb 6 x bb 7 8 z cc 如果在A列中,我想用A列中的值填充B列中的空单元格 last_available_value_before_the_NaNs_in_A.split()[-1] == next_available_value_after_the_NaNs_in_A.split(
A B
0 x aa
1 z aa
2
3
4 x aa
5 z bb
6 x bb
7
8 z cc
如果在A列中,我想用A列中的值填充B列中的空单元格
last_available_value_before_the_NaNs_in_A.split()[-1] == next_available_value_after_the_NaNs_in_A.split()[-1]
希望的结果是:
A B
0 x aa aa
1 z aa aa
2 aa
3 aa
4 x aa aa
5 z bb bb
6 x bb bb
7
8 z cc cc
data.loc(7,'B')
将为NaN,因为data.loc(6,'A').split()[-1]=
data.loc(8,'A').split()[-1]
为false
data.loc(5,'B')
是'bb',因为data.loc(5,'A').split()[-1]='bb'
谢谢你的帮助 为了说明这个想法,这是冗长的
# create a column that jsut holds the last value
df["lastval"] = df.A.str.split().str[-1]
# fill blanks in a feed-forward manner
df["ffill"] = df.lastval.fillna(method="ffill")
# fill blanks in a feed-backward manner
df["bfill"] = df.lastval.fillna(method="bfill")
# create a mask that handles your logic
m = df.lastval.isnull() & (df["ffill"] == df["bfill"])
# fill those values into B from lastval
df["B"] = df["lastval"]
df.loc[m,"B"] = df.loc[m, "ffill"]
您可以比较使用
ffill
的版本和使用bfill
的版本:
f = df.A.fillna(method='ffill').str.split().str[-1]
b = df.A.fillna(method='bfill').str.split().str[-1]
df.B.where(f != b, f, inplace=True)
为什么
data.loc[5,'B']
会被填充<代码>数据.loc[4,'A'].split()[-1]!=data.loc[5,'A'].split()[-1]。另外,您能否更准确地指出,last\u available\u value
和next\u available\u value
实际表示的是什么?您好,来宾,因为[5,'A']中的数据是给定的。您好,我指的是NAN之前的最后一个可用值(以及NAN之后的下一个可用值),您的比我的要紧凑得多。喜欢吗