Pandas按多列分组应用Krippendorff's alpha函数报错求助
问题解决:Pandas分组应用自定义函数报错
TypeError: 'numpy.float64' object is not callable 场景与需求
现有如下结构的Pandas DataFrame:
| Chapter | label_code | annotator | rounded_lenght |
|---|---|---|---|
| Chapter1 | 1 | 1 | 159 |
| Chapter 2 | 3 | 2 | 30 |
| Chapter 2 | 4 | 2 | 150 |
字段说明:
label_code:8种情绪的数字编码annotator:标注者IDrounded_lenght:文本片段长度Chapter:书籍章节
需求:按Chapter和label_code分组,对每组应用自定义函数krippendorffs_emotion(该函数内部调用sf.calculate_krippendorffs_alpha_for_df计算标注者一致性Krippendorff's alpha)。
错误代码与报错
尝试执行的代码:
grouped_df = emo_chapters_df.groupby(['Chapter','label_code']).apply(kripendorf_emotion(emo_chapters_df)) grouped_df
运行时报错:
TypeError: 'numpy.float64' object is not callable
错误原因分析
你直接调用了kripendorf_emotion(emo_chapters_df),这会立即执行该函数并返回一个numpy.float64类型的结果,但apply方法需要接收的是函数对象,不是函数执行后的返回值。相当于把一个数值传给了apply,而数值无法被调用,因此触发该错误。
解决方法
方法1:直接传递函数对象(推荐)
将函数名直接传给apply,apply会自动把每个分组的子DataFrame作为参数传入函数:
grouped_df = emo_chapters_df.groupby(['Chapter','label_code']).apply(kripendorf_emotion) grouped_df
方法2:用lambda包装(需额外参数时使用)
如果krippendorffs_emotion需要分组子DataFrame之外的其他参数,可通过lambda包装传递:
# 示例:传入额外参数param1 grouped_df = emo_chapters_df.groupby(['Chapter','label_code']).apply(lambda x: krippendorffs_emotion(x, param1=xxx)) grouped_df
额外注意
- 确保
krippendorffs_emotion函数的第一个参数用于接收分组后的子DataFrame - 若部分分组数据量不足(比如仅单个标注者),需在函数内部添加判断逻辑,避免计算Krippendorff's alpha时触发额外报错
内容的提问来源于stack exchange,提问作者ledbug
相关产品推荐
相关产品推荐

