2014-10-24 2 views
1

У меня есть dataframe, где я хочу суммировать значения в 20 различных столбцов на основе общих enteries в столбце «VALUE»GroupBy несколько столбцов

Вот как я делаю это для одного столбца:

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

Есть ли лучший способ расширить его на 20 столбцов, где я не пишу их имена явно? I.e, я хотел бы просто передать список имен столбцов.

См. Нижеприведенный ответ hernamesbarbara для примера, который может быть использован для иллюстрации этой проблемы.

ответ

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 
+0

Спасибо за пример. В моем случае около 30 столбцов: «measure1», «measure2» ... «measure30». Тем не менее, я хочу применить sum() к 'measure1' ... 'measure20'. есть способ df.groupby (['dim1']) ['measure1', 'measure2']. sum() может быть записана без необходимости писать все 20 имен столбцов. Это важно, потому что некоторые из моих имен столбцов генерируются программно, и я не знаю их имен заранее. – user308827

+0

ok, переместил имена столбцов в список. теперь он сделает то, что я хочу. благодаря! – user308827

Смежные вопросы