2 回答

TA贡献1816条经验 获得超4个赞
使用GroupBy.apply具有前进和后退填充缺失值和布尔面膜则设定值:
cols = ['name','age']
df1 = df.groupby(['code'])[cols].apply(lambda x: x.ffill().bfill())
mask = df['char'] == 'ts'
df.loc[mask, cols] = df1.loc[mask, cols]
print (df)
code name age char
0 101 Carl 19.0 ts
1 101 NaN NaN tt
2 101 Carl 19.0 tt
3 102 NaN NaN ts
4 102 NaN NaN tt
5 102 NaN NaN tt
6 103 Aoi 23.0 ts
7 103 Aoi 23.0 tt
8 103 NaN NaN tt

TA贡献1827条经验 获得超8个赞
在一行中:
result = df.copy()
result.update(df.groupby(['code']).bfill()[df['char']=='ts'])
result
code name age char
0 101.0 Carl 19.0 ts
1 101.0 NaN NaN tt
2 101.0 Carl 19.0 tt
3 102.0 NaN NaN ts
4 102.0 NaN NaN tt
5 102.0 NaN NaN tt
6 103.0 Aoi 23.0 ts
7 103.0 Aoi 23.0 tt
8 103.0 NaN NaN tt
解释
通过执行以下操作,数据框填充了'char' == 'ts' 已填充代码的任何可用值的行:
df.groupby(['code']).bfill()
code name age char
0 101 Carl 19.0 ts
1 101 Carl 19.0 tt
2 101 Carl 19.0 tt
3 102 NaN NaN ts
4 102 NaN NaN tt
5 102 NaN NaN tt
6 103 Aoi 23.0 ts
7 103 Aoi 23.0 tt
8 103 NaN NaN tt
df.groupby(['code']).bfill()[df['char']=='ts']
code name age char
0 101 Carl 19.0 ts
3 102 NaN NaN ts
6 103 Aoi 23.0 ts
添加回答
举报