熊猫根据上一个可用值和下一个可用值填充NaN

时间:2019-05-31 09:52:42

标签: 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中的值填充B列中的空白单元格(如果在A列中)

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]为假。

data.loc(5,'B')是'bb',因为data.loc(5,'A').split()[-1] == 'bb'

感谢您的帮助!

2 个答案:

答案 0 :(得分:3)

您可以比较使用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)

答案 1 :(得分:0)

这很冗长,无法说明这一点。

# 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"]