我的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'
感谢您的帮助!
答案 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"]