2016-12-08 11 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 

私はdiv要素は動作しますが、これは憶測でどのように変化してい欠損カテゴリに戻って追加することによって、疑います。私が期待している答えを得るために何が欠けていますか?

答えて

1

df2の長さはdf1と最後の変更axis='index'と同じである場合は、df1のインデックスでdf2のインデックスを設定することができます。

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 
関連する問題