Python 有效地计算在一组其他分组变量中分组的多个独立列的值_计数

Python 有效地计算在一组其他分组变量中分组的多个独立列的值_计数,python,pandas,dataframe,Python,Pandas,Dataframe,我需要计算一组固定的2-5个其他列所分组的大量独立列的值的计数(例如,由value_counts表示)。本练习是数据挖掘的一部分,数据中最多有数百万行和50-100列。因此,解决方案需要尽可能高效。为了将内存中的所有数据放在一起,我在读取源数据时预先将所有列转换为“category”类型 以下数据可用作示例: raw_data = {'grpVar1': ['A', 'A', 'A', 'B', 'B', 'B'], 'grpVar2': ['X', 'Y', 'X', 'Y'

我需要计算一组固定的2-5个其他列所分组的大量独立列的值的计数(例如,由value_counts表示)。本练习是数据挖掘的一部分,数据中最多有数百万行和50-100列。因此,解决方案需要尽可能高效。为了将内存中的所有数据放在一起,我在读取源数据时预先将所有列转换为“category”类型

以下数据可用作示例:

raw_data = {'grpVar1': ['A', 'A', 'A', 'B', 'B', 'B'], 
        'grpVar2': ['X', 'Y', 'X', 'Y', 'Z','X'], 
        'catVar1': ['car', 'bike', 'car', 'bike', 'car', 'bike'], 
        'catVar2': ['red','blue','black', 'red','blue','black']}
df = pd.DataFrame(raw_data, columns = ['grpVar1', 'grpVar2', 'catVar1', 'catVar2'])
df = df.astype('category')
对于上述数据,我希望得到如下汇总数据。请忽略组的排序顺序

grpVar1  grpVar2  Column   Value    Count
A        X        catVar1  car        2
         Y        catVar1  bike       1
B        X        catVar1  bike       1
         Y        catVar1  bike       1
         Z        catVar1  car        1
A        X        catVar2  black      1
                  catVar2  red        1
         Y        catVar2  blue       1
B        X        catVar2  black      1
         Y        catVar2  red        1
         Z        catVar2  blue       1

我能想到的一个选择是融化数据帧,然后进行值计数。但是,从内存角度(因为现在数据不再是分类的和未压缩的)和性能角度来看,这似乎不是一个明智的选择。请告知

循环通过要熔化的列。执行groupby并连接。这可能会节省一些空间。说到时间,这可能比不上熔化功能

df['cnt'] = 1
output = []
for col in df.columns[2:-1]:
    grp = df[list(df.columns[:2])+ [col] + ['cnt']].groupby(list(df.columns[:2])+ [col]).sum().dropna()
    grp['column'] = col
    grp.rename({col: 'value'}, inplace=True)
    output.append(grp)

output = pd.concat(output)

循环通过要融化的列。执行groupby并连接。这可能会节省一些空间。说到时间,这可能比不上熔化功能

df['cnt'] = 1
output = []
for col in df.columns[2:-1]:
    grp = df[list(df.columns[:2])+ [col] + ['cnt']].groupby(list(df.columns[:2])+ [col]).sum().dropna()
    grp['column'] = col
    grp.rename({col: 'value'}, inplace=True)
    output.append(grp)

output = pd.concat(output)

您可以熔化然后执行透视表操作。您可以熔化然后执行透视表操作。谢谢。由于性能不佳,我正在尝试远离逐列处理。也许我可以将列集合在一起进行熔化。这将缓解将所有列合并在一起时的内存问题。@Vinet是的,尝试合并,速度会很快。如果您的计算需要非常密集,您可以尝试多处理。:)谢谢由于性能不佳,我正在尝试远离逐列处理。也许我可以将列集合在一起进行熔化。这将缓解将所有列合并在一起时的内存问题。@Vinet是的,尝试合并,速度会很快。如果您的计算需要非常密集,您可以尝试多处理。:)