Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python:是否可以对分类数据运行数学/统计操作?_Python_Pandas - Fatal编程技术网

python:是否可以对分类数据运行数学/统计操作?

python:是否可以对分类数据运行数学/统计操作?,python,pandas,Python,Pandas,我已经将一个较大的df(相对于可用RAM的较大值)转换为分类列。这节省了约80%的内存空间。现在我需要对数据运行数学/统计操作。是否有一种方法可以对熊猫中的分类数据运行诸如sum、mean、max和rank之类的操作 创建df 输出: group owner failed granted_pe slots 0 g1 u1 0 single 1 1 g50 u92 0 shared 8 2 g50 u9

我已经将一个较大的df(相对于可用RAM的较大值)转换为分类列。这节省了约80%的内存空间。现在我需要对数据运行数学/统计操作。是否有一种方法可以对熊猫中的分类数据运行诸如
sum
mean
max
rank
之类的操作

创建df 输出:

  group owner  failed granted_pe  slots
0    g1    u1       0     single      1
1   g50   u92       0     shared      8
2   g50   u92       0     shared      1
转为范畴 求和 输出:

“TypeError:Category无法执行求和操作”


有没有其他方法可以在不将数据转换回int的情况下执行此操作?

您可以在此处使用
apply
并合并回原始
df

def return_sum(values):
    return(sum(values))

df = df.merge(pd.DataFrame(df.groupby('group')['slots'].apply(return_sum)).reset_index(),on='group')
df = df.rename(columns={'slots_x': 'slots', 'slots_y': 'slot_sum'})
print(df)
输出

  group owner failed granted_pe   slots  slots_sum
0    g1    u1      0     single       1        1
1   g50   u92      0     shared       8        9
2   g50   u92      0     shared       1        9

注意:
mean
max
etc方法不适用于分类数据,因为它没有意义

我知道“分类”数据通常是str/object,但在这种情况下,我想要处理的底层数据(例如,“slot”)是数字的。我使用类型
category
只是为了节省内存占用。所以我认为可以根据这些值进行计算。当我运行代码时,我得到了这个错误:“ValueError:传递的项数错误24,placement意味着1”
def return\u sum(values):
return(sum(values))
df['slots\u sum']=df.merge(pd.DataFrame(df.groupby('group')['slots'].apply(return\u sum)).reset\u index(),on='group')
@KarlBaker assign df=df.merge。。。。。合并将返回一个数据帧,而不是一个序列。我的答案中有工作代码。只要复制粘贴就行了谢谢,它适用于求和函数。我想接下来我必须先将数据转换回数字。@jezrael,当转换成分类的数据是数字时,有没有办法对分类数据运行
mean
?我使用分类数据类型将df在内存中的大小减少了约80%。
df['slots_sum'] = df.groupby('group')['slots'].transform('sum')
def return_sum(values):
    return(sum(values))

df = df.merge(pd.DataFrame(df.groupby('group')['slots'].apply(return_sum)).reset_index(),on='group')
df = df.rename(columns={'slots_x': 'slots', 'slots_y': 'slot_sum'})
print(df)
  group owner failed granted_pe   slots  slots_sum
0    g1    u1      0     single       1        1
1   g50   u92      0     shared       8        9
2   g50   u92      0     shared       1        9