Pandas 1.3.5升级至1.4.x后startTime返回array而非字符串问题
Pandas 1.4.x+版本groupby agg后的startTime返回numpy数组问题分析与解决
问题原因
- np.unique返回值处理逻辑变更:Pandas 1.3.5中,对分组后的单值Series应用
np.unique时,内部会自动将单元素numpy数组转换为标量(字符串);但1.4.x及以上版本取消了这个隐式转换,直接返回np.unique的原生结果——单元素numpy数组。 - 分组键的冗余agg操作触发警告:你在
groupby(['startTime'])后,又对startTime列执行agg操作,这属于无效操作——分组后每个组的startTime值本身就是唯一的。Pandas 1.4.x+开始严格校验这类不合理的agg调用,因此抛出FutureWarning,提示未来版本会直接抛出TypeError。
替代实现方案
方案一:移除分组列的agg操作(推荐)
既然分组键startTime在每个组中值唯一,无需对其执行agg,直接通过reset_index将分组索引转为列即可:
print(df.T.to_dict().values()) df = df.reset_index().groupby(['startTime']).agg({ 'endTimes': list, 'durationSplit': list, 'split': list, }).reset_index() print(df.T.to_dict().values())
处理后startTime会以字符串标量形式存在,同时彻底消除警告。
方案二:将numpy数组转为标量
如果必须保留对startTime的agg操作,可修改逻辑将单元素数组转为标量:
print(df.T.to_dict().values()) df = df.reset_index().groupby(['startTime']).agg({ 'startTime': lambda x: np.unique(x).item(), # 提取单元素数组的标量值 'endTimes': list, 'durationSplit': list, 'split': list, }) print(df.T.to_dict().values())
更简洁的方式是用first(因每个组的startTime值唯一):
'startTime': 'first'
方案三:使用Pandas原生unique方法
替换np.unique为Pandas Series的unique方法,并提取第一个元素:
'startTime': lambda x: x.unique()[0]
内容的提问来源于stack exchange,提问作者Mathias Brugger
相关产品推荐
相关产品推荐

