2016-06-30 5 views
1

두 데이터 프레임이 있습니다. 하나는 팀 목록과 날짜순으로 정렬 된 점수이고 두 번째는 개별 날짜입니다. 나는이 dataframes에서 통계를 일치하는 60 열이, 나는 상대가 DF1에서 이전 날짜에 있던 평균 DF2 각 열의 값을 대체하는 코드가 노력하고 있어요 : 그래서에서다른 데이터 프레임의 조건부 그룹을 사용하여 팬더 데이터 프레임 채우기

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? 또한 단 한 블록의 코드로 모든 열을 반복 할 수있는 방법이 있습니까? 아니면 각 열마다 코드를 사용해야합니까?

답변

0

한 가지 해결책을 찾았습니다. 아마도 그다지 우아하지 않을 수도 있습니다. 실제로 누군가가 실제로 이것을보고 좋은 점이있는 경우 다시 확인해 볼 것입니다. 열 머리글의 목록을 만든 다음 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() 
관련 문제