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

时间:2019-11-03 20:22:43

标签: python pandas dataframe

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

以下数据可作为示例:

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

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

1 个答案:

答案 0 :(得分:0)

循环浏览要融合的列。进行分组和连接。这样可以节省一些空间。说到时间,这可能不会超过融化功能。

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)