首页 > 解决方案 > Pandas Groupby:TypeError:不支持的操作数类型为-:'str'和'str'

问题描述

我已经尝试了另一种解决方案,所以它们都与 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'

但是,如果我单独检查(最大,最小)它们会起作用。我检查了列的类型VAL1VAL2它们的int64类型

标签: pythonpandasgroup-by

解决方案


在 v0.22 之前,这是一个错误。从 v0.23 开始,默认情况下会忽略非数字列。

不幸的是,groupby.apply它将尝试在每一列上运行您的 lambda,包括您分组的列(“NAME”,它是一个字符串)。

您可以通过检查两者之间的差异来确认

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 的列进行分组要慢),但这意味着您不必单独列出每一列。

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。


推荐阅读