根据另外两列Dataframe计算Columne中的值



我正在尝试计算物理和数学两个类的平均值,并将其包含在单独的列平均值中。此外,我只是想计算两个都需要分数的班级的平均值。这正在制作一个过滤器。唯一不起作用的想法是计算平均值。对于缺失的,它是有效的,但不知何故,它将我的值设置为零,这很奇怪。数据如下:

Date        School  Math    Physics Mean    Flag
01.01.2020  ABC     3       4               1
01.03.2020  ABC     2       3               1
01.05.2020  ABC     2       1       1.5     2
01.07.2020  ABC     2       1               1
01.08.2020  ABC     2       1       1.5     2
01.04.2020  ABC     2                       3
01.06.2020  ABC             1               3

我的代码如下:

import pandas as pd
path = 'School_grades.xlsx'
df = pd.read_excel(path)
df_copy = df.copy(deep=True)
df_copy['Date'] = pd.to_datetime(df_copy.Date)
df_copy = df_copy[(df_copy["Flag"] != 3)]
df_copy['Mean'] = ((df_copy['Math'] + df_copy['Physics'])/2).where(df_copy['Flag'] == 1)
print(df_copy)

我的代码提供了以下内容,其中我已经将Means包含在NaN:中

Date     School  Math  Physics  Mean  Flag
0 2020-01-01    ABC     3.0   4.0      3.5     1
1 2020-01-03    ABC     2.0   3.0      2.5     1
2 2020-01-05    ABC     2.0   1.0      NaN     2
3 2020-01-07    ABC     2.0   1.0      1.5     1
4 2020-01-08    ABC     2.0   1.0      NaN     2

但我宁愿期待这样的东西:

Date     School  Math  Physics  Mean  Flag
0 2020-01-01    ABC     3.0   4.0      3.5     1
1 2020-01-03    ABC     2.0   3.0      2.5     1
2 2020-01-05    ABC     2.0   1.0      1.5     2
3 2020-01-07    ABC     2.0   1.0      1.5     1
4 2020-01-08    ABC     2.0   1.0      1.5     2

where((方法没有"否则";语句,但为数据帧的每一行返回一个序列。这意味着它只会在where语句为True的地方返回值,而在其为False的地方则会丢失值,基本上会丢弃以前的结果。有多种方法可以解决这个问题。一个是下面使用numpy库。

np.where((本质上有一个具有True/False值的序列。其中True使用下一个提供的序列,而false使用最后一个提供序列。在这里我们插入前面的平均值。

import numpy as np
df_copy['Mean'] = np.where(df_copy['Flag'] == 1, ((df_copy['Math'] + df_copy['Physics'])/2), df_copy['Mean'])

您忘记在pandas.where()中添加other参数

>> df_copy['Mean'] = ((df_copy['Math'] + df_copy['Physics'])/2).where(df_copy['Flag'] == 1,df_copy['Mean'])
>> print(df_copy)
Date        School  Math  Physics  Mean  Flag
0  01.01.2020    ABC   3.0      4.0   3.5     1
1  01.03.2020    ABC   2.0      3.0   2.5     1
2  01.05.2020    ABC   2.0      1.0   1.5     2
3  01.07.2020    ABC   2.0      1.0   1.5     1
4  01.08.2020    ABC   2.0      1.0   1.5     2
5  01.04.2020    ABC   2.0      NaN   NaN     3
6  01.06.2020    ABC   NaN      1.0   NaN     3

使用pandas.DataFrame.mean计算平均

df_copy['Mean'] = df_copy[['Math','Physics']].mean(axis=1).where(df_copy.Flag == 1,df_copy['Mean'])

您也可以使用numpy.where

import numpy as np
df_copy['Mean'] = np.where(df_copy.Flag == 1,df_copy[['Math','Physics']].mean(axis=1),df_copy['Mean'])

最新更新