
在数据分析和处理中,我们经常会遇到需要整合来自不同数据源的信息。一个常见场景是,我们有两个dataframe:
我们的目标是创建一个新的DataFrame,它基于DF_1的结构,但DF_2中的数值列已根据DF_1中对应键的出现次数进行了“拆分”或“分配”。例如,如果DF_2中键'A'的值是100,而DF_1中'A'出现了4次,那么在最终结果中,每个'A'对应的数值应为25 (100 / 4)。
解决此类问题的关键在于以下几个Pandas操作的组合:
为了更好地说明,我们使用以下示例数据来模拟问题场景:
import pandas as pd
import numpy as np
# DataFrame 1 (DF_1): 包含重复键
data1 = {'id': ['A', 'B', 'A', 'C', 'A', 'A', 'C']}
df1 = pd.DataFrame(data1)
print("DF_1:")
print(df1)
# DataFrame 2 (DF_2): 包含唯一键和数据值
data2 = {'id': ['A', 'B', 'C'],
'Col1': [400, 200, 600],
'Col2': [100, np.nan, 800],
'Col3': [20, 800, np.nan]}
df2 = pd.DataFrame(data2)
print("\nDF_2:")
print(df2)DF_1:
id 0 A 1 B 2 A 3 C 4 A 5 A 6 C
DF_2:
id Col1 Col2 Col3 0 A 400 100.0 20.0 1 B 200 NaN 800.0 2 C 600 800.0 NaN
以下是实现所需功能的Pandas代码:
out = (df1.reset_index() # 1. 重置df1的索引,将原索引保存为'index'列
.merge(df2.set_index('id') # 2. 将df2的'id'列设为索引
.div(df1['id'].value_counts(), axis=0), # 3. 计算df1中'id'的频率并用其除df2的数据列
on='id', # 4. 根据'id'列进行左合并
how='left')
.set_index('index').reindex(df1.index) # 5. 恢复原始df1的索引和顺序
)
print("\nOutput DataFrame:")
print(out)输出结果:
id Col1 Col2 Col3 0 A 100.0 25.0 5.0 1 B 200.0 NaN 800.0 2 A 100.0 25.0 5.0 3 C 300.0 400.0 NaN 4 A 100.0 25.0 5.0 5 A 100.0 25.0 5.0 6 C 300.0 400.0 NaN
让我们逐行分析上述解决方案:
df1.reset_index():
df2.set_index('id'):
.div(df1['id'].value_counts(), axis=0):
.merge(..., on='id', how='left'):
.set_index('index').reindex(df1.index):
通过巧妙地结合value_counts()、div()和merge()这三个核心Pandas函数,我们可以高效且精确地实现基于键匹配与计数的DataFrame值分配任务。这种方法不仅结构清晰,易于理解,而且在处理复杂的数据整合场景时表现出强大的灵活性和性能。掌握这些技巧,将极大地提升您在Pandas中进行数据清洗和转换的能力。
以上就是Pandas DataFrame中基于键匹配与计数的智能值分配教程的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号