
在数据分析中,我们经常需要对数据进行汇总和聚合。pandas库提供了pivot_table和groupby().agg()等强大工具。然而,在使用pivot_table时,一个常见的陷阱是当其index参数指定的列中包含缺失值(nan)时,这些行会被隐式地丢弃,导致最终的聚合结果不完整。
考虑以下示例数据集:
import pandas as pd
import numpy as np
data = {
'id': [101, 101, 101, 201, 201, 201, 201, 201],
'name': ['India', 'India', 'India', 'Kenya', 'Kenya', np.nan, np.nan, np.nan],
'start_date': ['2023-06-06', '2023-06-06', '2023-06-06', '2023-09-15', '2023-09-15', np.nan, np.nan, np.nan],
'clicks': [1, 2, 1, 5, 2, np.nan, np.nan, np.nan],
'conversions': [4, 5, 6, 8, 1, np.nan, np.nan, np.nan],
'installs': [0, 0, 0, 0, 0, np.nan, np.nan, np.nan],
'downloads': [np.nan, np.nan, np.nan, np.nan, np.nan, 10, 5, 4]
}
df = pd.DataFrame(data)
df['start_date'] = pd.to_datetime(df['start_date']) # 确保日期格式
print("原始DataFrame:")
print(df.to_markdown(index=False))原始DataFrame:
| id | name | start_date | clicks | conversions | installs | downloads | |---:|:-----|:-----------|-------:|------------:|---------:|----------:| | 101 | India | 2023-06-06 | 1 | 4 | 0 | nan | | 101 | India | 2023-06-06 | 2 | 5 | 0 | nan | | 101 | India | 2023-06-06 | 1 | 6 | 0 | nan | | 201 | Kenya | 2023-09-15 | 5 | 8 | 0 | nan | | 201 | Kenya | 2023-09-15 | 2 | 1 | 0 | nan | | 201 | nan | NaT | nan | nan | nan | 10 | | 201 | nan | NaT | nan | nan | nan | 5 | | 201 | nan | NaT | nan | nan | nan | 4 |
我们尝试使用pivot_table对数据进行聚合,以id, name, start_date作为索引,并对clicks, conversions, installs, downloads进行求和:
pivot_df = pd.pivot_table(
df,
index=['id','name','start_date'],
aggfunc={'clicks': 'sum','conversions': 'sum','installs': 'sum', 'downloads': 'sum'}
)
print("\npivot_table聚合结果:")
print(pivot_df.to_markdown())pivot_table聚合结果:
| id | name | start_date | clicks | conversions | installs | downloads | |---:|:-----|:-----------|-------:|------------:|---------:|----------:| | 101 | India | 2023-06-06 | 4 | 15 | 0 | 0 | | 201 | Kenya | 2023-09-15 | 7 | 9 | 0 | 0 |
观察id=201的downloads列,其聚合结果为0。然而,在原始数据中,id=201存在三条downloads值为10, 5, 4的记录,总和应为19。pivot_table之所以返回0,是因为这三条记录的name和start_date列为NaN(或NaT,Pandas中的日期时间缺失值),而这些列被指定为pivot_table的索引。pivot_table在构建索引时,会默认丢弃所有索引列中包含缺失值的行。
为了解决pivot_table因索引缺失值导致数据丢失的问题,groupby().agg()提供了更强大的灵活性和控制。它允许我们按指定的列进行分组,然后对每个分组内的不同列应用不同的聚合函数,而不会因为非分组列的缺失值而丢弃整行。
以下是使用groupby().agg()实现正确聚合的代码:
out_df = (df.groupby('id', as_index=False)
.agg({'name': 'first',
'start_date': 'first',
'clicks': 'sum',
'conversions': 'sum',
'installs': 'sum',
'downloads': 'sum'})
)
print("\ngroupby().agg()聚合结果:")
print(out_df.to_markdown(index=False))groupby().agg()聚合结果:
| id | name | start_date | clicks | conversions | installs | downloads | |---:|:-----|:-----------|-------:|------------:|---------:|----------:| | 101 | India | 2023-06-06 | 4 | 15 | 0 | 0 | | 201 | Kenya | 2023-09-15 | 7 | 9 | 0 | 19 |
现在,id=201的downloads列正确地显示为19。
让我们深入理解groupby().agg()的工作原理:
df.groupby('id', as_index=False):
.agg({...}):
通过理解pivot_table和groupby().agg()在处理缺失值方面的不同行为,我们可以更准确、更高效地完成Pandas中的数据聚合任务,避免因工具选择不当而导致的数据分析错误。
以上就是Pandas数据聚合:解决pivot_table因索引缺失值导致数据不全的问题的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号