如何将同一my_key的多行数据转换为含varying_column计数的单行
问题与解决方案
问题描述
现有如下结构的DataFrame:
import pandas as pd df = pd.DataFrame( {'col1':['foo','foo','foo','foo','foo','foo'], 'col2':['bar','bar','bar','bar','bar','bar'], 'col3':['baz','baz','baz','baz','baz','baz'], 'varying_column':['x','y','z','d','e','f']}, index=['a','b','c','a','a','b'] ).reset_index().rename(columns={'index':'my_key'})
原始数据展示:
| my_key | col1 | col2 | col3 | varying_column |
|---|---|---|---|---|
| a | foo | bar | baz | x |
| b | foo | bar | baz | y |
| c | foo | bar | baz | z |
| a | foo | bar | baz | d |
| a | foo | bar | baz | e |
| b | foo | bar | baz | f |
需求:按my_key将数据合并为一行,新增count_varying_column列统计该my_key对应去重后varying_column的数量。真实数据中col1、col2、col3可能存在不同值,需合理处理这些列的聚合。
解决方案
核心逻辑
通过groupby按my_key分组,对varying_column用nunique()统计去重后的数量;对其他列根据业务需求选择合适的聚合方式(比如取首个值、众数等)。
代码实现
场景1:同组内其他列值一致(如示例数据)
直接分组聚合即可得到目标结果:
result = df.groupby('my_key').agg( col1=('col1', 'first'), col2=('col2', 'first'), col3=('col3', 'first'), count_varying_column=('varying_column', 'nunique') ).reset_index()
输出结果:
| my_key | col1 | col2 | col3 | count_varying_column |
|---|---|---|---|---|
| a | foo | bar | baz | 3 |
| b | foo | bar | baz | 2 |
| c | foo | bar | baz | 1 |
场景2:同组内其他列存在不同值
如果同组内col1等列有不同值,可根据需求调整聚合方式:
- 取众数:适合多数值一致的场景
- 拼接所有唯一值:保留所有不同信息
- 取最大/最小值:数值型列适用
示例(以取众数为例):
result = df.groupby('my_key').agg( col1=('col1', lambda x: x.mode()[0]), col2=('col2', lambda x: x.mode()[0]), col3=('col3', lambda x: x.mode()[0]), count_varying_column=('varying_column', 'nunique') ).reset_index()
关键注意点
- 必须用
nunique()替代count():确保统计的是去重后的varying_column数量,满足需求。 - 其他列的聚合方式要贴合业务:避免随意取数导致数据失真。
内容的提问来源于stack exchange,提问作者bismo
相关产品推荐
相关产品推荐

