使用Pandas操作与过滤数据集:跨数据集匹配填充NaN值
用Pandas填充数据集空值的解决方案
看起来你需要把dataset2里的用户详细信息,匹配填充到dataset1中对应姓名的空值列里——毕竟dataset1里同一个姓名对应多个分组,而dataset2里每个姓名只有一条完整数据对吧?用Python的Pandas库就能轻松实现,我给你一步步来:
1. 先构造示例数据(和你描述的一致)
首先我们先把你说的两个数据集用代码还原出来,方便后续操作:
import pandas as pd # 构造你的dataset1:同一个Name对应多个Group,其余列空值 dataset1 = pd.DataFrame({ 'Name': ['John Smith', 'John Smith', 'John Smith', 'James Man'], 'Group': [1, 2, 3, 1], 'Colour': [pd.NA, pd.NA, pd.NA, pd.NA], 'Age': [pd.NA, pd.NA, pd.NA, pd.NA], 'Title': [pd.NA, pd.NA, pd.NA, pd.NA], 'JobRole': [pd.NA, pd.NA, pd.NA, pd.NA] }) # 构造你的dataset2:每个Name对应一条完整数据 dataset2 = pd.DataFrame({ 'Name': ['John Smith', 'James Man'], 'Colour': ['Red', 'Orange'], 'Age': [35, 21], 'Title': ['Mr', 'Mr'], 'JobRole': ['SuperMan', 'SuperMan'] })
2. 核心填充操作(两种方法任选)
方法一:简洁的combine_first法(推荐)
这个方法能自动把dataset2的信息匹配到dataset1的所有同名行,而且会保留dataset1原有的Group列:
# 先把dataset2以Name为索引,方便按姓名匹配 dataset2_indexed = dataset2.set_index('Name') # 对dataset1设置Name为索引,用dataset2的数据填充空值,最后恢复原索引 dataset1_filled = dataset1.set_index('Name').combine_first(dataset2_indexed).reset_index()
方法二:显式合并法(更直观)
如果你想更清晰地看到匹配过程,可以用merge左连接,再手动填充空值:
# 按Name左连接两个数据集,suffixes区分原列和来自dataset2的列 merged_data = dataset1.merge(dataset2, on='Name', how='left', suffixes=('', '_from_dataset2')) # 遍历需要填充的列,用dataset2的值替换原空值 for col in ['Colour', 'Age', 'Title', 'JobRole']: dataset1[col] = merged_data[col].fillna(merged_data[f'{col}_from_dataset2'])
3. 验证结果
不管用哪种方法,最终dataset1_filled(或者修改后的dataset1)都会变成:
| Name | Group | Colour | Age | Title | JobRole |
|---|---|---|---|---|---|
| John Smith | 1 | Red | 35 | Mr | SuperMan |
| John Smith | 2 | Red | 35 | Mr | SuperMan |
| John Smith | 3 | Red | 35 | Mr | SuperMan |
| James Man | 1 | Orange | 21 | Mr | SuperMan |
完美符合你的需求:每个姓名的所有分组行都填充上了dataset2里对应的数据。
额外提示
如果dataset2里有重复的姓名条目,记得先去重,避免匹配出错:
# 保留每个Name的第一条数据,删除重复项 dataset2 = dataset2.drop_duplicates(subset='Name', keep='first')
内容的提问来源于stack exchange,提问作者iNoob
相关产品推荐
相关产品推荐

