【发布时间】:2020-11-02 03:15:49
【问题描述】:
我正在尝试将 DataFrame 分成四个部分,并使用 fillna() 为每个部分估算四舍五入的平均值。我有两列,main_campus 和 degree_type 我要过滤,每列有两个唯一值。所以在他们之间,我应该能够将 DataFrame 过滤成两组。
我首先使用三重 for 循环(见下文)执行此操作,这似乎有效,但是当我尝试以更优雅的方式执行此操作时,我收到了 SettingWithCopy 警告,我无法通过使用来修复.loc 或.copy(),即使将inplace 设置为True,也不会填充缺失值。这是后一种方法的代码:
# Imputing mean values for main campus BA students
df[(df.main_campus == 1) &
(df.degree_type == 'BA')] = df[(df.main_campus == 1) &
(df.degree_type == 'BA')].fillna(
df[(nulled_data.main_campus == 1) &
(df.degree_type == 'BA')
].mean(),
inplace=True)
# Imputing mean values for main campus BS students
df[(df.main_campus == 1) &
(df.degree_type == 'BS')] = df[(df.main_campus == 1) &
(df.degree_type == 'BS')].fillna(
df[(df.main_campus == 1) &
(df.degree_type == 'BS')
].mean(),
inplace=True)
# Imputing mean values for downtown campus BA students
df[(df.main_campus == 0) &
(df.degree_type == 'BA')] = df[(df.main_campus == 0) &
(df.degree_type == 'BA')].fillna(
df[(df.main_campus == 0) &
(df.degree_type == 'BA')
].mean(),
inplace=True)
# Imputing mean values for downtown campus BS students
df[(df.main_campus == 0) &
(df.degree_type == 'BS')] = df[(df.main_campus == 0) &
(df.degree_type == 'BS')].fillna(
df[(df.main_campus == 0) &
(df.degree_type == 'BS')
].mean(),
inplace=True)
我应该提到之前的代码经历了几次迭代,尝试它而不将其设置回切片,有和没有inplace等。
下面是带有三重 for 循环的代码:
imputation_cols = [# all the columns I want to impute]
for col in imputation_cols:
for i in [1, 0]:
for path in ['BA', 'BS']:
group = ndf.loc[((df.main_campus == i) &
(df.degree_type == path)), :]
group = group.fillna(value=round(group.mean()))
df.loc[((df.main_campus == i) &
(df.degree_type == path)), :] = group
值得一提的是,我认为在三重 for 循环代码中使用 group 变量也是为了帮助填充的 NaN 值实际设置回 DataFrame,但我需要仔细检查。
有人知道这里发生了什么吗?
【问题讨论】:
标签: python pandas fillna in-place pandas-loc