我有两个数据框,一个是按日期排序的团队和分数列表,另一个是具有日期的第二个玩家。我在这些数据框中有60列匹配的统计数据,我正在尝试使用代码替换df2中每列中的值,以及对手在df1之前的日期中的平均值:
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 < / p>
我尝试了以下(以及其他类似的选项)并且没有运气:
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
任何解决方案?还有一种方法可以用一个代码块迭代所有列,或者我是否必须为每列提供代码?
答案 0 :(得分: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()