【问题标题】:How to drop row in dataframe if I want to get average but there are no data points from before如果我想获得平均值但之前没有数据点,如何在数据框中删除行
【发布时间】:2021-07-07 11:52:05
【问题描述】:

我有一个包含超过 4000 行的数据框,我正在根据该原始数据框计算另一个数据框中第 1179 行的平均值。如果在 for 循环中的比赛之前客队或主队的值计数低于 3,那么我想在第二个数据帧中删除行。

数据框示例:

    Date       Match ID  Home team     Away team   Home score Away score 
1 2016/11/11         2   Penn St.      Wright St.    29       30          
2 2016/11/11         3  Southern Ill.  N.C. Central  33       34         
3 2016/11/11         4  East Carolina  Wichita St.   42       21          
4 2016/11/11         5  Longwood       Colgate       32       42         
5 2016/11/11         6  Lipscomb       Boston U.     21       21  
df = pd.read_csv('test.csv')
df1 = df.iloc[1179:]
matches = []
for a in df1['Match ID']:
    matches.append(a)

for match in matches:
    match_line = df1.loc[df1['Match ID'] == match]
    idx = df.index.get_loc(df[df['Match ID'] == match].index[0])
    print(idx)

    neki1 = df.iloc[:idx]
    home_team = match_line['Home team'].values[0]
    away_team = match_line['Away team'].values[0]
    home = neki1[neki1['Home team'] == home_team]
    home1 = neki1[neki1['Away team'] == home_team]
    away = neki1[neki1['Home team'] == away_team]
    away1 = neki1[neki1['Away team'] == away_team]

    home_score = []
    away_score = []
    for data in home['Home score']:
        home_score.append(data)
    for data in home1['Away score']:
        away_score.append(data)

    df1.loc[df1['Match ID'] == match, 'Home score'] = mean(home_score)
    df1.loc[df1['Match ID'] == match, 'Away score'] = mean(away_score)

我尝试了 value_counts 但我没有得到正确的结果,因为它没有正确放置,所以我只想知道放置它的逻辑。 我希望我很清楚:)

【问题讨论】:

  • 你能分享一下数据框吗?至少几行适当的列
  • 刚刚添加到原帖
  • 您能否将数据以文本形式共享,以便轻松复制。另外,您的意思是“value_count”还是列中的值?理想情况下还要给出一个输出示例
  • 输出将是未达到分数的平均分数,而球队的比赛少于 3 场比赛。因此,例如 A 队得分 50、50、50、50、80 分,但上一场比赛是对阵一支到目前为止只打了 2 场比赛的球队,平均应该是 50 分而不是 56 分,所以理想情况下我会放弃那一排不计入它的意思
  • 从图片改为文字

标签: python-3.x pandas dataframe


【解决方案1】:

您希望在每场比赛中获得 IIUC 之前得分的平均值:

  • 为那个团队
  • 同侧(主场或客场)
  • 从第 1179 行开始
  • 至少 3 场比赛的平均水平

这个概念被称为expanding transformation,这里的转换是平均值(或mean)。

这应该可以大致工作:

df1 = df.iloc[1179:]
df1['Home score'] = df.groupby(['Home team'])['Home score']\
                      .transform(lambda s: s.expanding(3).mean()).iloc[1179:]
df1['Away score'] = df.groupby(['Away team'])['Away score']\
                      .transform(lambda s: s.expanding(3).mean()).iloc[1179:]

基本上我们使用原始数据框和:

  • 按团队分组,仅获取该团队的结果
  • .transform返回一个相同索引的系列,基本不改变返回的形状
  • 在变换内部,我们现在只有想要平均的游戏,因此我们运行一个扩展均值,至少包含 3 个值
  • 最后,我们通过切断第 1179 行之前的结果来限制我们放入 df1 的内容

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-07
    • 2015-11-01
    • 2019-12-22
    • 2017-09-19
    • 1970-01-01
    • 1970-01-01
    • 2017-01-01
    • 2018-12-01
    相关资源
    最近更新 更多