2016-02-26 6 views
0

У меня есть панда dataframe так:Расчесывания значения dataframe панды на основе другого столбца значений

import pandas as pd 
import numpy as np 

df = pd.DataFrame([['WY','M',2014,'Seth',5], 
      ['WY','M',2014,'Spencer',5], 
      ['WY','M',2014,'Tyce',5], 
      ['NY','M',2014,'Seth',25], 
      ['MA','M',2014,'Spencer',23]],columns = ['state','sex','year','name','number']) 

print df 

Как манипулировать данные, чтобы получить dataframe как:

df1 = pd.DataFrame([['M',2014,'Seth',30], 
       ['M',2014,'Spencer',28], 
       ['M',2014,'Tyce',5]], 
columns = ['sex','year','name','number']) 

print df1 

Это только часть из очень большого кадра данных, как бы я сделал это для каждого имени за каждый год?

ответ

1
df[['sex','year','name','number']].groupby(['sex','year','name']).sum().reset_index() 

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

  1. выбрать только колонны мы заботимся о. Мы можем заменить эту часть на df.drop('state',axis=1)
  2. Выполните группу на колонках, о которых мы заботимся.
  3. Составьте оставшиеся столбцы (в данном случае только number).
  4. Сбросьте индекс так, чтобы столбцы ['sex','year','name'] больше не являются частью индекса.
0

вы можете использовать поворотный стол

df.pivot_table(values = 'number',aggfunc = 'sum',columns = ['sex','year','name']).reset_index().rename(columns={0:'number'}) 
0

Группу по столбцам, которые вы хотите, сумма number, и придавить многоиндексный:

df.groupby(['sex','year','name'])['number'].sum().reset_index() 

В вашем случае столбец state не в сумме, поэтому вы можете сократить до:

df.groupby(['sex','year','name']).sum().reset_index() 
Смежные вопросы