升级Pandas版本后transform()返回全NaN值问题求助
问题原因
升级Pandas后,groupby.transform()的索引匹配逻辑变得更严格:transform要求传入函数返回的结果必须和输入的分组对象索引完全一致。
你的代码里,function_name接收的S是带三级索引(mouse, target, barcode)的分组Series,执行S.index.droplevel(['mouse'])后得到二级索引,用这个去reindex df2得到的lambdas是二级索引的Series。返回的结果索引和输入的S的索引不匹配,Pandas无法正确对齐,因此最终输出全为NaN。
而apply只是简单拼接各组结果,不强制索引完全匹配,所以能得到数值,但会因为索引重复导致后续使用异常。
解决方法
修改function_name,确保返回的Series索引和输入的S的索引完全一致。可以通过保留原索引,只提取需要的级别来匹配df2,然后将计算结果重新关联原索引:
import pandas as pd import numpy as np df1_arrays = [ np.array(["CAT","CAT","CAT","CAT","CAT","CAT","CAT","CAT"]), np.array(["A","A","A","A","B","B","B","B"]), np.array(["AAAT","AAAG","AAAC","AAAD","AAAZ","AAAX","AAAW","AAAM"]), ] df2_arrays = [ np.array(["A","A","A","A","B","B","B","B"]), np.array(["AAAT","AAAG","AAAC","AAAD","AAAZ","AAAX","AAAW","AAAM"]), ] df1 = pd.Series(np.abs(np.random.randn(8))*100, index=df1_arrays) df2 = pd.Series(np.abs(np.random.randn(8)), index=df2_arrays) df1.index.set_names(["mouse", "target", "barcode"], inplace=True) df2.index.set_names(["target", "barcode"], inplace=True) def function_name(S): # 提取当前分组的target和barcode索引级别,用于匹配df2 match_index = S.index.get_level_values(['target', 'barcode']) lambdas = df2.reindex(match_index) * len(S) # 将计算结果的索引替换为原S的索引,确保完全匹配 lambdas.index = S.index return (-lambdas/np.expm1(-lambdas) - 1) gb = df1.groupby(level=['mouse','target']) d_collisions = gb.transform(function_name) print(d_collisions)
关键改动说明
- 用
S.index.get_level_values(['target', 'barcode'])提取需要匹配的索引级别,而非droplevel,避免丢失原索引信息 - 将计算得到的
lambdas的索引重置为原S的索引,保证返回结果的索引和输入分组的索引完全对齐,让transform能正确映射结果
内容的提问来源于stack exchange,提问作者cloudbox
相关产品推荐
相关产品推荐

