
本教程将详细介绍如何使用pandas在两个dataframe之间生成所有可能的组合,并根据原始数据填充相应的值,对于不存在的组合则填充默认值(如0)。我们将通过一个实际案例,演示如何利用交叉连接(cross join)和左连接(left merge)高效地构建完整的个人-词汇清单,从而清晰地识别出每个个体所包含和未包含的词汇。
在数据分析实践中,我们经常会遇到需要检查某个实体(例如“人”)是否包含了某个特定项目(例如“词汇”)的情况。原始数据通常只记录了实际存在的组合,而我们可能需要一个包含所有可能组合的完整视图,并明确标记出缺失的组合。例如,给定一个记录了每个人所选词汇的DataFrame和一个完整的词汇列表,我们希望生成一个表格,显示每个人是否选择了列表中的每一个词汇,未选择的词汇则标记为0。
首先,我们定义原始的词汇选择数据和完整的词汇列表:
import pandas as pd
# 原始数据:记录了每个人选择的词汇及其计数
df = pd.DataFrame({
'person': [1, 1, 1, 2, 3, 4, 4, 4, 4],
'word': ['apple', 'orange', 'pear', 'apple', 'grape', 'orange', 'apple', 'pear', 'berry'],
'count': [1, 1, 1, 1, 1, 1, 1, 1, 1]
})
# 完整的词汇列表
word_list = ['apple', 'orange', 'pear', 'berry', 'grape']
word_df = pd.DataFrame({'word': word_list})
print("原始数据 (df):")
print(df)
print("\n完整词汇列表 (word_df):")
print(word_df)我们的目标是为每个person和word_list中的每个word生成一个组合,并从df中填充count值,对于df中不存在的组合则填充0。
要实现我们的目标,第一步是生成所有“人”与所有“词汇”的可能组合。这可以通过Pandas的交叉连接(Cross Join)功能实现。
# 提取所有唯一的person
unique_persons_df = df[['person']].drop_duplicates()
# 生成所有可能的person-word组合
# 使用how='cross'进行交叉连接
all_person_word_combos = word_df.merge(unique_persons_df, how='cross')
print("\n所有可能的person-word组合 (all_person_word_combos):")
print(all_person_word_combos.sort_values(['person', 'word']))此时,all_person_word_combos DataFrame包含了所有person和word_list中所有word的组合,无论这些组合在原始df中是否存在。
接下来,我们需要将原始数据df合并到all_person_word_combos中,并处理缺失值。
# 将原始数据df左连接到所有组合上
# 如果组合在df中不存在,则count列为NaN
final_result = (
all_person_word_combos
.merge(df, how='left', on=['word', 'person'])
# 填充NaN值为0,表示该组合未被选择
.fillna(0)
# 按照person和word排序,使结果更清晰
.sort_values(['person', 'word'])
)
print("\n最终结果 (final_result):")
print(final_result)通过上述步骤,我们成功生成了符合预期的数据结构。例如,对于person=1,原始数据中包含了apple、orange、pear,而berry和grape则通过fillna(0)被标记为0,准确反映了person 1未选择这些词汇。
word person count 0 apple 1 1.0 1 berry 1 0.0 2 grape 1 0.0 3 orange 1 1.0 4 pear 1 1.0 5 apple 2 1.0 6 berry 2 0.0 7 grape 2 0.0 8 orange 2 0.0 9 pear 2 0.0 10 apple 3 0.0 11 berry 3 0.0 12 grape 3 1.0 13 orange 3 0.0 14 pear 3 0.0 15 apple 4 1.0 16 berry 4 1.0 17 grape 4 0.0 18 orange 4 1.0 19 pear 4 1.0
通过结合Pandas的merge(how='cross')进行交叉连接和merge(how='left')进行左连接,并辅以fillna(0),我们可以有效地生成所有可能的组合,并将原始数据中的值映射到这些组合上,同时为缺失的组合填充默认值。这种方法在需要构建完整的数据视图,以便进行全面分析或报告时非常有用。
以上就是Pandas数据补全:利用交叉连接和左连接处理组合缺失值的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号