2016-12-08 3 views
1

Я пытаюсь вычислить суммарную сумму и затем разделить каждый столбец этой совокупной суммы на другой столбец фрейма данных. См. Код ниже.Pandas divide создает дополнительные столбцы и NaN

import pandas as pd 
import numpy as np 


def cum_sums(input_df): 

    bin_values = np.arange(0, 72, 24) 
    group_names = np.arange(0, 48, 24) 

    input_df['categories'] = pd.cut(input_df['time'], bin_values, labels=group_names) 
    category_sum = input_df.groupby(['area', 'categories'])['categories'].size() 
    cum_sum = category_sum.groupby(level=[0]).cumsum().reset_index(name='cum_sum') 
    # pivot to get right format 
    cum_sum_flipped = cum_sum.pivot(index='area', columns='categories', values='cum_sum') 
    # and then add back in any missing categories 
    cum_sum_flipped = cum_sum_flipped.reindex(columns=group_names).ffill(axis=1).replace('Nan', 0, regex=True) 

    return cum_sum_flipped 

data1 = {'area': ['a', 'b', 'c', 'a', 'b'], 
     'time': [7, 11, 25, 27, 34]} 
data2 = {'area': ['a', 'b', 'c'], 
     "count": [2, 2, 3]} 


df1 = pd.DataFrame(data1) 
df2 = pd.DataFrame(data2) 

df = cum_sums(df1) 
print(df) 
print(df2['count']) 

df = df.div(df2['count'], axis='columns') 

print(df) 

Это дает:

 0 1 2 24 
area     
a  0.5 NaN NaN NaN 
b  0.5 NaN NaN NaN 
c  0.0 NaN NaN NaN 

Где бы ожидать:

 0 24 
area     
a  0.5 1.0 
b  0.5 1.0 
c  0.0 0.33333 

я подозреваю, добавив назад в недостающих категорий я меняюсь, каким образом Див работает, но это предположение. Что мне недостает, чтобы получить ответ, который я ожидаю?

ответ

1

Вы можете установить индекс df2 по индексу df1 если длина df2 такой же, как и df1 последнего изменения axis='index':

df2.index = df.index 
df = df.div(df2['count'], axis='index') 
print(df) 
categories 0   24 
area      
a   0.5 1.000000 
b   0.5 1.000000 
c   0.0 0.333333 
Смежные вопросы