2017-02-20 7 views
1

У меня есть вопрос относительно панд dataframes:Панды Dataframe GroupBy: двойной GroupBy и применить функцию

У меня есть dataframe вроде следующего,

df = pd.DataFrame([[1,1,10],[1,1,30],[1,2,40],[2,3,50],[2,3,150],[2,4,100]],columns=["a","b","c"]) 

    a b c 
0 1 1 10 
1 1 1 30 
2 1 2 40 
3 2 3 50 
4 2 3 150 
5 2 4 100 

И я хочу, чтобы произвести следующий вывод,

a "new col" 
0 1 30 
1 2 100 

, где первая линия рассчитывается как:

  1. Group DF по первой колонке «а»,
  2. Затем группы, каждый из сгруппированного объекта «B»
  3. вычислить среднее значение «с» для этого б-групп
  4. вычислить средства все би-groupbs для одного «а»
  5. это окончательное значение сохраняется в «новой седловине» для одного «а»

Я могу себе представить, что это как-то странно, но я надеюсь, что это понятно, тем не менее.

я достиг желаемого результата, но, как мне это нужно для огромного dataframe, мое решение, вероятно, значительно замедлить,

pd.DataFrame([ [a, adata.groupby("b").agg({"c": lambda x:x.mean()}).mean()[0]] for a,adata in df.groupby("a") ],columns=["a","new col"]) 
    a new col 
0 1  30.0 
1 2 100.0 

Поэтому то, что мне нужно что-то вроде (?) ФР. groupby ("a"). groupby ("b") ["c"]. mean()

Спасибо вам большое!

ответ

2

Вот один из способов

In [101]: (df.groupby(['a', 'b'], as_index=False)['c'].mean() 
      .groupby('a', as_index=False)['c'].mean() 
      .rename(columns={'c': 'new col'})) 
Out[101]: 
    a new col 
0 1  30 
1 2  100 
1
df.groupby(['a','b']).mean().reset_index().groupby('a').mean() 
Out[117]: 
    b  c 
a    
1 1.5 30.0 
2 3.5 100.0 
2
In [57]: df.groupby(['a','b'])['c'].mean().mean(level=0).reset_index() 
Out[57]: 
    a c 
0 1 30 
1 2 100 
Смежные вопросы