我已经尝试了另一个解决方案,此错误在SO上都与Python输入或raw_input有关,但没有解决我的问题。
txt = '''series NAME VAL1 VAL2
0 AAA 27 678
1 BBB 45 744
2 CCC 34 275
3 AAA 29 932
4 CCC 47 288
5 BBB 24 971
'''
df = pd.read_table(StringIO(txt),sep = '\s+')
del df['series']
df = df.groupby('NAME').apply(lambda x: x.max()-x.min())
TypeError:--'str'和'str'的不受支持的操作数类型
但是,如果我单独检查(最大,最小),它们就可以工作。我已经检查了列VAL1
和VAL2
的类型,它们是int64
类型的
答案 0 :(得分:1)
这是一个直到v0.22的错误。从v0.23开始,非数字列 默认情况下会被忽略。
不幸的是,groupby.apply
会尝试在每个列(包括您分组的列(“ NAME”,它是一个字符串))上运行lambda。
您可以通过检查两者之间的差异来确认
df.groupby('NAME')[['VAL1', 'VAL2']].apply(lambda x: x.max() - x.min())
VAL1 VAL2
NAME
AAA 2 254
BBB 21 227
CCC 13 13
对
df.groupby('NAME')['NAME'].apply(lambda x: x.max() - x.min())
---------------------------------------------------------------------------
TypeError
基本上,显式优于隐式。
或者,选择所有数字列并传递一个Series作为分组器(请注意,这比对属于DataFrame的列进行分组要慢),但这意味着您不必单独列出每个列。 / p>
df.select_dtypes('number').groupby(df.NAME).apply(lambda x: x.max() - x.min())
VAL1 VAL2
NAME
AAA 2 254
BBB 21 227
CCC 13 13
感谢@JC。