Pandas Groupby:TypeError:-:'str'和'str'不支持的操作数类型

时间:2018-08-18 09:42:54

标签: python pandas group-by

我已经尝试了另一个解决方案,此错误在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'的不受支持的操作数类型

  

但是,如果我单独检查(最大,最小),它们就可以工作。我已经检查了列VAL1VAL2的类型,它们是int64类型的

1 个答案:

答案 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。