2016-10-24 7 views
0

私は2つのデータフレームをマージし、GIVEN IDの過去の観測値の平均値を取る3つの列を計算します。ここ複雑なマージ・パンダnumpyと集計

は一例であり:

contracts_data = np.array([ 
         [1, '2015-01-01', 15000], 
         [2, '2015-01-01', 1500], 
         [1, '2015-08-01', 16000], 
         [2, '2015-08-01', 1800], 
         [1, '2015-10-01', 17000], 
         [1, '2016-01-01', 18000], 
         [1, '2016-03-01', 20000]]) 


    historique_data = np.array([[1, '2015-01-01'], 
         [2, '2015-01-01'], 
         [1, '2015-02-01'], 
         [2, '2015-02-01'], 
         [1, '2015-03-01'], 
         [2, '2015-03-01'], 
         [1, '2015-04-01'], 
         [2, '2015-04-01'], 
         [1, '2015-05-01'], 
         [2, '2015-05-01'], 
         [1, '2015-06-01'], 
         [2, '2015-06-01'], 
         [1, '2015-07-01'], 
         [2, '2015-07-01'], 
         [1, '2015-08-01'], 
         [2, '2015-08-01'], 
         [1, '2015-09-01'], 
         [2, '2015-09-01'], 
         [1, '2015-10-01'], 
         [2, '2015-10-01'], 
         [1, '2015-11-01'], 
         [2, '2015-11-01'], 
         [1, '2015-12-01'], 
         [2, '2015-12-01'], 
         [1, '2016-01-01'], 
         [2, '2016-01-01'], 
         [1, '2016-02-01'], 
         [2, '2016-02-01'], 
         [1, '2016-03-01'], 
         [2, '2016-03-01'], 
         [1, '2016-04-01'], 
         [2, '2016-04-01'], 
         [1, '2016-05-01'], 
         [2, '2016-05-01']]) 

    historique_data_expected = np.array([[1, '2015-01-01', 15000], 
         [2, '2015-01-01', 1500], 
         [1, '2015-02-01', 15000], 
         [2, '2015-02-01', 1500], 
         [1, '2015-03-01', 15000], 
         [2, '2015-03-01', 1500], 
         [1, '2015-04-01', 15000], 
         [2, '2015-04-01', 1500], 
         [1, '2015-05-01', 15000], 
         [2, '2015-05-01', 1500], 
         [1, '2015-06-01', 15000], 
         [2, '2015-06-01', 1500], 
         [1, '2015-07-01', 15000], 
         [2, '2015-07-01', 1500], 
         [1, '2015-08-01', 15500], 
         [2, '2015-08-01', 1650], 
         [1, '2015-09-01', 15500], 
         [2, '2015-09-01', 1650], 
         [1, '2015-10-01', 16000], 
         [2, '2015-10-01', 1650], 
         [1, '2015-11-01', 16000], 
         [2, '2015-11-01', 1650], 
         [1, '2015-12-01', 16000], 
         [2, '2015-12-01', 1650], 
         [1, '2016-01-01', 16500], 
         [2, '2016-01-01', 1650], 
         [1, '2016-02-01', 16500], 
         [2, '2016-02-01', 1650], 
         [1, '2016-03-01', 17200], 
         [2, '2016-03-01', 1650], 
         [1, '2016-04-01', 17200], 
         [2, '2016-04-01', 1650], 
         [1, '2016-05-01', 17200], 
         [2, '2016-05-01', 1650]]) 
  • 最初の列が結合列です。
  • 2番目は日付です
  • 3は給料です。

私は3つのデータセットに参加したいと思います。私は給与の列に同じIDの過去の給与の平均を持っています。

これは、pandasとnumpy、または別のフレームワークを使用してどのように行うことができますか?

ありがとうございます。

===== UPDATE ====

私は2つのデータフレームのいくつかのより簡単な例と予想される結果、ここで追加します。

ID DATE   SALARY 
1 2015-01-01 1500  
2 2015-01-01 1000  
1 2015-03-01 1600  
1 2015-04-01 1700  

ID DATE 
1 2015-01-01 
2 2015-01-01 
1 2015-02-01 
2 2015-02-01 
1 2015-03-01 
2 2015-03-01 
1 2015-04-01 
2 2015-04-01 

期待される結果:

ID DATE 
1 2015-01-01 1500 
2 2015-01-01 1000 
1 2015-02-01 1500 
2 2015-02-01 1000 
1 2015-03-01 1550 
2 2015-03-01 1000 
1 2015-04-01 1600 
2 2015-04-01 1000 

他の言葉では、2つのデータセットを結合するときに過去の平均給与を計算したい

+1

このデータは有用です。私はまだ非常に混乱しています。あなたが探しているものの例を提供してください。また、http://stackoverflow.com/help/mcve投稿方法のガイダンスについてもお読みください – piRSquared

+0

小規模な例で私の更新をご覧ください – Nabil

+0

@Nabil私はあなたの更新された例に間違いがあると思います。 2番目のdfには給与情報がないので、平均がどこから来るのかわかりません。 – cd98

答えて

1

条件付き実行平均の適用関数:

from io import StringIO 
import pandas as pd 
import numpy as np 

data = ''' 
ID DATE   SALARY 
1 2015-01-01 1500  
2 2015-01-01 1000  
1 2015-03-01 1600  
1 2015-04-01 1700 
''' 
df1 = pd.read_table(StringIO(data), sep="\s+", parse_dates=[1]) 

data = ''' 
ID DATE 
1 2015-01-01 
2 2015-01-01 
1 2015-02-01 
2 2015-02-01 
1 2015-03-01 
2 2015-03-01 
1 2015-04-01 
2 2015-04-01 
''' 
df2 = pd.read_table(StringIO(data), sep="\s+", parse_dates=[1]) 

df = pd.merge(df1, df2, on=['ID', 'DATE'], how='outer').sort_values('DATE')\ 
            .reset_index(drop=True) 

df['AVGSALARY'] = df.apply(lambda x: np.mean(df[(df['ID'] == x['ID']) & \ 
            (df['DATE'] <= x['DATE'])]['SALARY']), axis=1)  
print(df) 

#  ID  DATE SALARY AVGSALARY 
# 0 1.0 2015-01-01 1500.0  1500.0 
# 1 2.0 2015-01-01 1000.0  1000.0 
# 2 1.0 2015-02-01  NaN  1500.0 
# 3 2.0 2015-02-01  NaN  1000.0 
# 4 1.0 2015-03-01 1600.0  1550.0 
# 5 2.0 2015-03-01  NaN  1000.0 
# 6 1.0 2015-04-01 1700.0  1600.0 
# 7 2.0 2015-04-01  NaN  1000.0 
関連する問題