|
|
这种情况很可能是数据格式问题。虽然代码看起来一样,但“单号数量”列的数据可能与其他列不同。
主要问题和解决方案:
1. 数据类型不一致问题
“单号数量”列可能包含混合类型数据(有些是数字,有些是字符串),这会导致 `nunique` 返回意外的结果。
检查数据类型:
- # 检查单号数量列的数据类型
- print(f"数据类型: {data11['单号数量'].dtype}")
- print(f"混合类型检查: {data11['单号数量'].apply(type).unique()}")
复制代码
统一为字符串类型:
- # 将单号数量列统一转换为字符串类型
- data11['单号数量'] = data11['单号数量'].astype(str)
- # 或者如果需要保留数值格式,可以先转换为字符串再运行透视
- data11['单号数量_str'] = data11['单号数量'].astype(str)
复制代码
2. 空格或特殊字符问题
“单号数量”列可能包含不可见的空格或特殊字符。
清理数据:
- # 去除空格和不可见字符
- data11['单号数量'] = data11['单号数量'].astype(str).str.strip()
- # 去除所有空白字符
- data11['单号数量'] = data11['单号数量'].str.replace(r'\s+', '', regex=True)
复制代码
3. NaN或空值问题
`nunique` 默认不计入NaN值,但有时空值会影响结果。
处理空值:
- # 检查空值
- print(f"空值数量: {data11['单号数量'].isna().sum()}")
- print(f"空字符串数量: {(data11['单号数量'] == '').sum()}")
- # 将空值替换为占位符(避免影响计数)
- data11['单号数量_clean'] = data11['单号数量'].fillna('MISSING')
复制代码
4. 完整解决方案
使用以下完整代码处理:
- import pandas as pd
- import numpy as np
- # 1. 创建单号数量的清理版本
- data11['单号数量_clean'] = (
- data11['单号数量']
- .astype(str) # 转为字符串
- .str.strip() # 去除空格
- .str.replace(r'\s+', '', regex=True) # 去除所有空白
- )
- # 如果值为空或NaN,标记为特殊值
- data11['单号数量_clean'] = data11['单号数量_clean'].replace(['', 'nan', 'NaN', 'None'], 'EMPTY_VALUE')
- # 2. 使用清理后的列进行透视
- df = pd.pivot_table(
- data11,
- values=['单号数量_clean', '实收费用', '经纪费金额'],
- index=['渠道来源'], # 请替换为实际的索引列
- aggfunc={
- '单号数量_clean': 'nunique',
- '实收费用': 'sum',
- '经纪费金额': 'sum'
- }
- ).reset_index()
- # 3. 重命名列
- df.columns = ['渠道来源', '单号数量', '实收费用', '经纪费金额']
- print(df)
复制代码
5. 快速诊断方法
运行以下代码查看问题:
- # 查看每组的实际单号数量
- test = data11.groupby('渠道来源')['单号数量'].apply(lambda x: list(x.unique()))
- for source, values in test.items():
- print(f"渠道来源: {source}")
- print(f"去重后单号数量: {len(values)}")
- print(f"示例值: {values[:5]}")
- print("-" * 50)
复制代码
关键点:问题通常出在数据清洗环节。虽然代码语法正确,但如果数据包含不一致的类型或隐藏字符,nunique 就会返回错误结果。先确保数据干净一致,再进行聚合计算。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 |
|