2016-10-12 11 views
2

は、私はいくつかの基本的なBI指標を計算します。私は日付のデータフレームをグループ化することにより、売上高を達成しましたし、価格を合計:計算MRRデータフレーム

df = df[["Date", "Price"]].groupby(df['Date'])["Price"].sum().reset_index()

は今、私は純収益に似ている、MRRを見つけたいが、場合には、列の数ヶ月は、より多くを持っています1カ月以上であれば、価格は次の月に均等に "移動"する必要があります。また、それは月単位でグループ分けされており、日単位ではありません。

たとえば、私が2016年1月に3ヶ月間に30ドルの行を持っている場合、1月に10ドル、2月に10ドル、3月に10ドルを追加する必要があります。

私の最初のアイデアは、データフレームを繰り返し、次の月に "移動"して新しいデータフレームを手動で作成する必要がある月数と金額を把握することでした。

しかし、最初に、パンダにそれを行うためのPythonicの方法はありますか?

データのデータフレームを再現する:

import pandas as pd 
df = pd.DataFrame({'date': ['01-01-2016', '05-01-2016', '10-01-2016','04-02-2016'], 
        'months': [1, 3, 1, 6], 
        'price': [40, 60, 20, 60]}) 

望ましい結果:

Date   | MRR 
January 2016 | 80 
February 2016| 30 
March 2016 | 10 
April 2016 | 10 
May 2016  | 10 
June 2016 | 10 
July 2016 | 10 

そして

January 2016 = 40 + 20 + 20 + 0 
February 2016 = 0 + 20 + 0 + 10 
March 2016 = 0 + 0 + 0 + 10 
April 2016 = 0 + 0 + 0 + 10 
May 2016 = 0 + 0 + 0 + 10 
June 2016 = 0 + 0 + 0 + 10 
July 2016 = 0 + 0 + 0 + 10 
+0

たとえば、まさにあなたがこれを行うことができますあなたの所望の出力を生成します。これは人々が投稿する前に迅速に回答を試すのに役立ちます。 –

+0

[良い再現可能なパンダの例を作る方法](http://stackoverflow.com/questions/20109391/how-to-make-good-reproducible-pandas-examples)をチェックしてください。 – jezrael

+0

両方のおかげで、私はいくつかのデータを追加しました。もう一度働かないで、私はもっと追加します。 – Tasos

答えて

1

行ごとに、次のように計算した結果、私は知りませんどのような方法でもループを使用することができます。しかし、コードをきれいで効率的にする方法を提案できます。

まず、あなたが質問テキストで供給される例のデータをロードしてみましょう:

df = pd.DataFrame({'date': ['01-01-2016', '05-01-2016', '10-01-2016','04-02-2016'], 
        'months': [1, 3, 1, 6], 
        'price': [40, 60, 20, 60]}) 

(例えば、月ごとにグループ化)パンダの日付機能を使用するために、我々はインデックスとしてdate列を使用します。実際にDateTimeIndex:今すぐ

df['date'] = pd.to_datetime(df['date'], format='%d-%m-%Y') 
df = df.set_index('date') 

は、それは、例えば、あなたが既に知っているgroupby機能と同じように動作resample関数を使用して、月ごとの要約を表示するには、本当に簡単です、しかし、時間使用しています期間:今

df.resample('M').sum() 

months列が複数ヶ月間で> 1である行を「広がる」します。ここでの私のアプローチは、行ごとに新しいDataFrameを生成することです:

dfs = [] 
for date, values in df.iterrows(): 
    months, price = values 
    dfs.append(
     pd.DataFrame(
      # Compute the price for each month, and repeat this value 
      data={'price': [price/months] * months}, 
      # The index is a date range for the requested number of months 
      index=pd.date_range(date, periods=months, freq='M') 
     ) 
    ) 

今、私たちはただ、DataFrameのリストを連結ヶ月にリサンプリングし、合計を取ることができます。

pd.concat(dfs).resample('M').sum() 

は出力:

  price 
2016-01-31  80 
2016-02-29  30 
2016-03-31  30 
2016-04-30  10 
2016-05-31  10 
2016-06-30  10 
2016-07-31  10 

パンダが時間に関して行うことができるすべてのクールなものについてはhttp://pandas.pydata.org/pandas-docs/stable/timeseries.htmlを参照してください。

output.index = output.index.strftime('%B %Y') 

この中で結果:あなたは、いくつかのおもちゃのデータを供給することによって、この問題がさらに良く作ることができ

   price 
January 2016  80 
February 2016  30 
March 2016  30 
April 2016  10 
May 2016   10 
June 2016   10 
July 2016   10 
+0

これはあなたのために機能しましたか? –

+0

数回試みましたが、月と価格の合計を含むデータフレームではなく、常に単一の値を返します。 – Tasos

関連する問題