суммирование строк в фрейме данных многоиндексных панд - PullRequest
0 голосов
/ 30 мая 2018

У меня есть кадр данных Pandas с мультииндексом

             A         B
year  age  
1895   0     10        12
1895   1     13        14
...
1965   0     34        45
1965   1     41        34
      ...
1965  50     56        22
1966   0     10        34
...

Я хотел бы получить все возрасты между двумя значениями (например, 10 и 20), суммируемые для столбца A (и B).Я немного поигрался с .xs, например,

pops.xs(20, level='age')

дает все 20 лет за каждый год, но я не могу получить это несколько раз (и суммировать).

Например.для 0 и 1 я хотел бы получить

Любые предложения для элегантного (эффективного) способа сделать это?

          A         B
year    
1895      23        26
...
1965      75        79
...

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Вы можете использовать loc и slice для выбора нужной части DF, например:

df.loc[(slice(None),slice(10,20)),:].sum(level=0)

, где (slice(None),slice(10,20)) позволяет сохранять все индексы для всех лет и возраста между10 и 20 включены

0 голосов
/ 30 мая 2018

Используйте query для выбора с sum для первого уровня year s:

print (df)
           A   B
year age        
1895 8    10  12
     12   13  14
1965 0    34  45
     14   41  34
     12   56  22
1966 0    10  34

df = df.query('10 <= age <= 20').sum(level=0)
print (df)
       A   B
year        
1895  13  14
1965  97  56

Detail :

print (df.query('10 <= age <= 20'))
           A   B
year age        
1895 12   13  14
1965 14   41  34
     12   56  22

Другим решением является использование Index.get_level_values для index и фильтрация по boolean indexing:

i = df.index.get_level_values('age')
print (i)
Int64Index([8, 12, 0, 14, 12, 0], dtype='int64', name='age')

df = df[(i >= 10) & (i <= 20)].sum(level=0)
print (df)
       A   B
year        
1895  13  14
1965  97  56
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...