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

2024-04-19 01:15:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个数据框,一个是按日期排序的球队和得分列表,第二个是带有日期的单个球员。在这些数据帧中,我有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

我尝试了以下方法(以及其他类似的方法),但没有成功:

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

有什么解决办法吗?还有一种可能的方法是用一块代码遍历所有的列,还是每个列都要有代码?你知道吗


Tags: 数据方法代码dateetcteamtordf1
1条回答
网友
1楼 · 发布于 2024-04-19 01:15:43

我找到了一个解决方案,也许不是很优雅,我会检查回来,以防有人真的看到这个,并有一个更好的。我创建了一个列标题列表,然后使用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()

相关问题 更多 >