吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 920|回复: 8
收起左侧

[求助] pandas如何用映射的方式填充缺失值(NA)?

[复制链接]
rsnodame 发表于 2022-11-26 15:28
本帖最后由 rsnodame 于 2022-11-26 15:37 编辑

样本数据如下:
[Python] 纯文本查看 复制代码
import pandas as pd
import numpy as np

sample = pd.Dataframe({'id': {0: 'a1', 1: 'a2', 2: 'a5', 3: 'b1', 4: 'b4', 5: 'n1', 6: 'b4', 7: 'n3'}, 'name': {0: 'ab', 1: 'ac', 2: np.nan, 3: 'bb', 4: np.nan, 5: np.nan, 6: np.nan, 7: 'np'}, 'item1': {0: 1, 1: 2, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8}, 'item2': {0: 9, 1: 10, 2: 11, 3: 12, 4: 13, 5: 14, 6: 15, 7: 16}})

m = pd.Dataframe({'id': {0: 'a3', 1: 'a5', 2: 'b3'}, 'name': {0: 'ad', 1: 'ag', 2: 'bp'}})


sample如下
id name item1 item2
a1 ab 1 9
a2 ac 2 10
a5 3 11
b1 bb 4 12
b4 5 13
n1 6 14
b4 7 15
n3 np 8 16


m如下
id name
a3 ad
a5 ag
b3 bp



希望利用m中的映射关系,把sample里【name】列中的缺失值(NA)填充。

不知各位有没有什么好的、简便的思路,不吝赐教{:1_927:}

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

leonrein 发表于 2022-11-26 16:29
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.fillna.html
第四个小例子应该是的
cflying 发表于 2022-11-26 16:47
本帖最后由 cflying 于 2022-11-26 16:55 编辑

把匹配关系构造成字典
然后这样应该可以
再不济最笨的办法,就是df1是原始数据,df1是匹配关系,然后两个merge出一个新数据列
[Python] 纯文本查看 复制代码
sample['name']=sample['name'].fillna((sample['id'].map({'a3': 'ad', 'a5': 'ag','b3':'bp'})))

免费评分

参与人数 1热心值 +1 收起 理由
rsnodame + 1 我很赞同!

查看全部评分

Green07 发表于 2022-11-26 17:02
[Python] 纯文本查看 复制代码
import pandas as pd
import numpy as np
 
sample = pd.Dataframe({'id': {0: 'a1', 1: 'a2', 2: 'a5', 3: 'b1', 4: 'b4', 5: 'n1', 6: 'b4', 7: 'n3'}, 'name': {0: 'ab', 1: 'ac', 2: np.nan, 3: 'bb', 4: np.nan, 5: np.nan, 6: np.nan, 7: 'np'}, 'item1': {0: 1, 1: 2, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8}, 'item2': {0: 9, 1: 10, 2: 11, 3: 12, 4: 13, 5: 14, 6: 15, 7: 16}})
 
m = pd.Dataframe({'id': {0: 'a3', 1: 'a5', 2: 'b3'}, 'name': {0: 'ad', 1: 'ag', 2: 'bp'}})

def check_nan(x):
	if pd.isnull(x['name_x']):
		return x['name_y']
	return x['name_x']

result.apply(lambda x:check_nan(x),axis = 1)

result[['id','name','item1','item2']]

print(result)



希望上面回答能帮助到你
头像被屏蔽
xiadongming 发表于 2022-11-26 20:01
提示: 作者被禁止或删除 内容自动屏蔽
 楼主| rsnodame 发表于 2022-11-26 23:21
leonrein 发表于 2022-11-26 16:29
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.fillna.html
第四个小例 ...

有点类似,但必须用columns去对应。考虑过这个方法,原数据需要转置或者重设index,是个解决思路,但总觉得不优美
 楼主| rsnodame 发表于 2022-11-26 23:22
cflying 发表于 2022-11-26 16:47
把匹配关系构造成字典
然后这样应该可以
再不济最笨的办法,就是df1是原始数据,df1是匹配关系,然后两个 ...

这个方法看上去很简洁,研究研究。谢谢
 楼主| rsnodame 发表于 2022-11-26 23:23
Green07 发表于 2022-11-26 17:02
[mw_shl_code=python,true]import pandas as pd
import numpy as np

apply也考虑过,但光想就觉得写起来会很麻烦
Green07 发表于 2022-11-29 11:50
rsnodame 发表于 2022-11-26 23:23
apply也考虑过,但光想就觉得写起来会很麻烦

或许你可以考虑一下把数据导入到数据库 如何用left join 加上 case when方式解决这个问题
用数据库是我一开始想到的方式
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 03:26

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表