Pandas中groupby+transform意外输出DataFrame,原因何在?
Pandas groupby.transform 出现意外额外输出的原因
先还原你的代码和问题场景:
你的代码:
import pandas as pd import numpy as np new = pd.DataFrame([1,2,3,4,5,6,7,8]) new.groupby(np.arange(len(new))//2).transform(lambda x: print(x, type(x), '***'))
你实际得到的输出里多了一行奇怪的DataFrame相关内容,而你预期的是只有四组Series的打印结果。
问题根源:交互式环境的自动打印 + transform的返回值
这个额外的输出其实是交互式Python环境(比如Jupyter Notebook、IPython)自动打印函数返回值导致的:
transform方法的作用是对每个分组应用函数后,返回一个和原DataFrame形状一致的对象。- 你的lambda函数里只有
print语句,没有显式返回任何值,所以lambda默认返回None。 transform会把每个分组返回的None组合成一个新的DataFrame(和原DataFrame一样是8行1列,所有值都是None)。- 在交互式环境中,如果你没有把函数的返回值赋值给变量,环境会自动把这个返回的DataFrame打印出来——你看到的那行奇怪的输出就是这个全为
None的DataFrame的字符串表示片段。
验证和解决方法
你可以把代码改成这样,将transform的返回值赋值给一个变量,就能避免环境自动打印它:
# 把结果赋值给变量,不会自动打印 result = new.groupby(np.arange(len(new))//2).transform(lambda x: print(x, type(x), '***'))
运行这段代码后,就只会输出你预期的四组Series的打印内容,不会再出现额外的DataFrame输出了。
内容的提问来源于stack exchange,提问作者Bubblethan
相关产品推荐
相关产品推荐

