python - 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'
但是,如果我单独检查(最大,最小)它们会起作用。我检查了列的类型VAL1
,VAL2
它们的int64
类型
解决方案
在 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。
推荐阅读
- android - 还必须在前台启动 Android 子服务吗?
- angular - 批量操作 NgRX 导入大量数据
- node.js - 异步函数中的 Https.request() 不会被调用
- stm32 - STM32CubeMx:如何添加自己的“USER CODE BEGIN / END”部分?
- eclipse - 三元组的树状视图并删除 URI
- d3.js - 函数 mousemove 代码在 d3.js 堆叠条形图中不起作用
- c++11 - 如何在复合设计模式中动态选择运算符 [ ] 的返回类型?
- ios - iOS Swift 4 重启导航控制器
- rust-cargo - 货物登记目录
- excel - 每次将公式中的数字加 2