使用来自另一个数据帧的条件组填充pandas数据帧

时间:2016-06-30 21:37:04

标签: python pandas dataframe

我有两个数据框,一个是按日期排序的团队和分数列表,另一个是具有日期的第二个玩家。我在这些数据框中有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

任何解决方案?还有一种方法可以用一个代码块迭代所有列,或者我是否必须为每列提供代码?

1 个答案:

答案 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()