我有包含以下列的数据框:姓名、姓氏、消息、时间 此数据框按每列排序。我有 message = '!' 的行姓氏为空。所以我想分配给前一行的那一行姓氏。有可能吗?我试过了
mask = df.surname.isna() and df[['message']] = '!'
df.loc[mask,'surname'] = df[[surname]].shift(-1)
但这不起作用
答案 0 :(得分:0)
首先删除双 []
为 message
进行比较 !
,然后使用 DataFrame.loc
为每组的两侧由 name
:
print (df)
name surname message
0 aa ss dd
1 aa NaN !
2 aa1 uu dd
3 aa1 NaN ii
4 aa2 rr tt
5 aa2 NaN !
6 aa2 NaN !
mask = df.surname.isna() & (df['message'] == '!')
df['surname'] = np.where(mask, df.groupby('name')['surname'].ffill(), df['surname'])
print (df)
name surname message
0 aa ss dd
1 aa ss !
2 aa1 uu dd
3 aa1 NaN ii
4 aa2 rr tt
5 aa2 rr !
6 aa2 rr !
如果使用不带 shift
的 -1
仅适用于掩码中有 Trues 的一行,如果在非匹配掩码前后存在,则在示例数据 row=1
中:
df['surname'] = np.where(mask, df['surname'].shift(), df['surname'])
print (df)
name surname message
0 aa ss dd
1 aa ss !
2 aa1 uu dd
3 aa1 NaN ii
4 aa2 NaN tt
5 aa2 NaN !
6 aa2 NaN !