为了账号安全,请及时绑定邮箱和手机立即绑定

Pandas 用基于另一列的第一个非 nan 值替换 nan

Pandas 用基于另一列的第一个非 nan 值替换 nan

翻过高山走不出你 2022-07-12 16:27:16
我有以下形式的数据框:(除了这些之外还有更多的列 - 为简洁起见删除)import pandas as pdheaders = ['A','B','C']data = [['p1','','v1'],        ['p2','','ba'],        ['p3',9,'fg'],        ['p1',1,'fg'],        ['p2',45,'af'],        ['p3',1,'fg'],        ['p1',1,'hf']        ]df = pd.DataFrame(data,columns=headers)    A   B   C0  p1      v11  p2      ba2  p3   9  fg3  p1   1  fg4  p2  45  af5  p3   1  fg6  p1   1  hfB 列有重复项,因此最新值应该是非 NA(但可能不是)我想用最新的非 NA 值替换 col B 值。像这样的东西:unique_people = df['A'].unique()for person in unique_people:    sub_df = df[df['A'] == person]    val = sub_df['B'].tail(1).values    df['A'][df['A'] == person] = val  # this also doesnt work because its not inplace我确定有更好的方法来做到这一点,但我不确定如何。有人能指出更好的方法吗?
查看完整描述

1 回答

?
呼唤远方

TA贡献1856条经验 获得超11个赞

首先将空字符串替换为缺失值,然后将GroupBy.transformwithGroupBy.last用于每组的最后一个非缺失值:


headers = ['A','B','C']

data = [['p1','','v1'],

        ['p2','','ba'],

        ['p3',9,'fg'],

        ['p1',1,'fg'],

        ['p2',45,'af'],

        ['p3',1,'fg'],

        ['p1','','hf']

        ]


df = pd.DataFrame(data,columns=headers)


df['B'] = df['B'].replace('', np.nan)


df['B'] = df.groupby('A')['B'].transform('last')

print (df)

    A     B   C

0  p1   1.0  v1

1  p2  45.0  ba

2  p3   1.0  fg

3  p1   1.0  fg

4  p2  45.0  af

5  p3   1.0  fg

6  p1   1.0  hf


查看完整回答
反对 回复 2022-07-12
  • 1 回答
  • 0 关注
  • 104 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号