Groupby多列

时间:2014-10-24 03:16:51

标签: python pandas

我有一个数据框,我想根据'VALUE'列中的常见输入结果总结20个不同列中的值

以下是我对单个列的处理方式:

df.groupby('VALUE').aggregate({'COUNT':numpy.sum},as_index=False)

有没有更好的方法将其扩展到20列,我没有明确地写出他们的名字?即,我想要一种只传递列名列表的方法。

请参阅下面的hernamesbarbara的答案,以获取可用于说明此问题的示例。

1 个答案:

答案 0 :(得分:3)

您可以使用pandas组中的子表示法选择要与列名列表相加的列。这是你正在寻找的吗?

import numpy as np
import pandas as pd

data = {
    "dim1":  [np.random.choice(['foo', 'bar']) for _ in range(10)],
    "measure1":  np.random.random_integers(0, 100, 10),
    "measure2":  np.random.random_integers(0, 100, 10)
}

df = pd.DataFrame(data)
df

Out[1]:
  dim1  measure1  measure2
0  bar         9        86
1  bar        24        64
2  bar        47        46
3  foo        60        98
4  bar        94        53
5  foo        95        89
6  foo        98         9
7  bar         4        95
8  foo        63        66
9  foo        40        47

df.groupby(['dim1'])['measure1', 'measure2'].sum()

Out[2]:
      measure1  measure2
dim1
bar        178       344
foo        356       309

更新2015-01-02 延迟回复以下评论,但迟到总比没有好

如果您不知道有多少列,但您知道列命名约定,请构建要动态聚合的列列表。这是一种方式:

colnames = ["measure".format(i+1) for i in range(100)]  # make 100 fake columns

df = pd.DataFrame(np.ones((10, 100)), columns=colnames)
df['dim1'] = [np.random.choice(['foo', 'bar']) for _ in range(10)]   # add fake dimension to groupby

desired_columns = [col for col in df.columns if "94" in col or "95" in col]   # select columns 94 and 95

df.groupby(['dim1'])[desired_columns].sum()

Out[52]:
      measure94  measure95
dim1
bar           4          4
foo           6          6