【问题标题】:Custom Selection of dataframe and replacing values of certain rows with mean自定义选择数据框并用平均值替换某些行的值
【发布时间】:2020-10-01 10:11:30
【问题描述】:
所以基本上我有一个有点像这样的数据集
我只想选择“哈佛”行并获取它们的均值,并将其替换为 GPA 中仅针对“哈佛”的缺失值和斯坦福大学的不同平均值
我试过data['GPA'].fillna(data['GPA'].mean()),但它只会用整列的平均值填充它。
【问题讨论】:
标签:
python
dataframe
jupyter-notebook
【解决方案1】:
给定一个包含问题中概述的数据的文件 (yourdata.csv),您可以使用以下示例将 GPA 列中的所有空值替换为每个对应 University 的平均值 GPA行。
此解决方案利用df.apply (docs) 将相同的条件逻辑应用于df 中的每一行。
import pandas as pd
import numpy as np
df = pd.read_csv('yourdata.csv')
df['GPA'].fillna(np.nan, inplace=True) # Ensuring null values in GPA col are np.nan
df['GPA'] = df.apply(
lambda row: df[df['University'] == row['University']]['GPA'].mean()
if np.isnan(row['GPA']) else row['GPA'], axis=1
)
如果您仅想在 University == 'Harvard' 的行上执行此逻辑(即不使用各自的平均值填充斯坦福、牛津等行中的空 GPA 值),您可以简单地将其添加为lambda 中的进一步条件应用于每一行,以确保只有 University == 'Harvard' 的行受到影响。
# Same imports, original df and fillna as above snippet
df['GPA'] = df.apply(
lambda row: df[df['University'] == row['University']]['GPA'].mean()
if np.isnan(row['GPA']) and row['University'] == 'Harvard'
else row['gpa'], axis=1
)
【解决方案2】:
看看这是否有效
df['GPA']=df[df['University']=='Havard'].fillna(df.mean())