在数据框中除一列(不删除它)外的所有列上填充 NaN 值

Fill NaN values on all columns except one (without dropping it) in dataframe

我想用“不可用”字符串为我的数据框中的所有列填充 NaN 值,除了一列(名为“滞后”)

我试过这个:

#fill NaN values with "Not Available" except in "lag" column
mydataset_df[mydataset_df.columns.difference(['lag'])].fillna("Not Available", inplace = True)

还有这个:

mydataset_df.loc[ : , mydataset_df.columns != 'lag'].fillna("Not Available", inplace = True)

我得到的是相同的结果:空白时没有列填充“不可用”。但是如果我执行:

mydataset.fillna("Not Available", inplace = True)

我得到 df 中的所有空白值都正确填充了“不可用”(所以我想这里的问题是代码字符串的第一部分,当我 select 命令需要的列时待申请)

有人可以帮我解决这个问题吗?我不想删除“滞后”列,我只想保留它并在有空白时填充所有其他列。

提前致谢

斯特凡诺

你可以试试这个

for col in mydataset_df.columns:
    if col != 'lag':
        mydataset_df[col].fillna("Not Available", inplace=True)

使用poppd.concat:

pop lag 列并在其他列中用 Not Available 填充 NAN。最后合并2.

df = pd.concat([df.pop('lag'), df.fillna('Not Available')], axis=1)

第一次尝试显示了一个提示:著名的“试图在 DataFrame 的切片副本上设置一个值”。这是 Pandas 的一个棘手部分,它试图告诉您您没有使用数据框本身。

在这种情况下,当您省略 inplace:

时会变得更加清晰
mydataset_df = pd.DataFrame({'lag': [1, 2, 3, pd.NA], 'foo': [2, 4, pd.NA, 8]})
print(mydataset_df[mydataset_df.columns.difference(['lag'])].fillna("Not Available"))

             foo
0              2
1              4
2  Not Available
3              8

fillna 没有传递整个数据框,只是对列的引用。此处有详细说明:https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy。简而言之,结果是“不可预测的”……肯定令人困惑。

使用相同的想法,但为了安全起见,您可以将数据框中的列替换为:

mydataset_df[mydataset_df.columns.difference(['lag'])] = mydataset_df[mydataset_df.columns.difference(['lag'])].fillna("Not Available")