我有一个具有以下结构的数据框:
code name age char
101 NaN NaN ts
101 NaN NaN tt
101 Carl 19 tt
102 NaN NaN ts
102 NaN NaN tt
102 NaN NaN tt
103 NaN NaN ts
103 Aoi 23 tt
103 NaN NaN tt
我想将“名称”和“年龄”列中的值复制到其他存在条件的行,条件是它们具有相同的“代码”和“字符”为“ ts”。 我想要的结果数据帧如下:
code name age char
101 Carl 19 ts
101 NaN NaN tt
101 Carl 19 tt
102 NaN NaN ts
102 NaN NaN tt
102 NaN NaN tt
103 Aoi 23 ts
103 Aoi 23 tt
103 NaN NaN tt
预先感谢您的帮助!
答案 0 :(得分:1)
使用GroupBy.apply
前后填充缺少的值ànd,然后通过布尔掩码设置值:
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
答案 1 :(得分:1)
一行:
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