You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 18:35:27