在数据框中除一列(不删除它)外的所有列上填充 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)
使用pop
和pd.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")
我想用“不可用”字符串为我的数据框中的所有列填充 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)
使用pop
和pd.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")