2016-06-30 8 views
1

私は2つのデータフレームを持っています.1つはチームのリストと日付でソートされたスコアです。私はこれらのデータフレームに統計情報のマッチングの60列を持っている、と私は相手がDF1から、前の日付に持っていた平均でDF2の各列の値を置き換えコードを持ってしようとしています:別のデータフレームの条件付きグループを使用してpandasデータフレームを埋め込む

df1:       df2: 
    date  team scr  name   team opp date  scr 
0 2016-04-03 KCR 5.70 0 Erasmo Ramirez TBR TOR 2016-04-06 7.90 
1 2016-04-03 NYM 4.70 1 Erasmo Ramirez TBR BAL 2016-04-10 1.30 
2 2016-04-03 PIT 6.30 2 Erasmo Ramirez TBR CLE 2016-04-13 9.30 
3 2016-04-03 STL 3.40 etc... 
4 2016-04-03 TBR 4.80 
5 2016-04-03 TOR 6.20* 
6 2016-04-04 ARI 7.40 
7 2016-04-04 ATL 5.30 
8 2016-04-04 BAL 7.00 
9 2016-04-04 CHC 9.60 
10 2016-04-04 TOR 7.50* 
etc... 

でそうこの例では、df2の 'scr'の下の最初のエントリは7.90から6.85に変更され、4-6(4-3と4-4)までの日付のTORの平均scrです。

以下の(と同様のオプション)と運がなかった:

jf = df1.groupby('team') 
df2['scr'] = jf.apply(lambda x: x[(df1['date']<x['date'])&(df1['team']==x['opp'])]['scr'].sum()) 

ValueError: Series lengths must match to compare 

任意のsolutio ns?また、1つのコードブロックですべての列を反復処理する方法もありますか、各列にコードを用意する必要がありますか?

答えて

0

私は1つの解決策を見つけましたが、それほどエレガントではないかもしれません。誰かが実際にこれを見て、より良いものを持っているかどうかチェックします。私は列見出しのリストを作成し、列の各列と行の両方を反復処理するためにiterrowsを使用しました。

batcol = pd.DataFrame(df1.columns) 
    batcol = batcol.iloc[6:-1] 
    batcol = batcol.reset_index(drop=True) 
    for index, row in batcol.iterrows(): 
     for i, rows in df2.iterrows(): 
      df2.loc[i, row] = df1[((df1['date'] < rows['date']) & (df1['team'] == rows['opp'])) == True].mean()[row].sum() 
関連する問題