从 pandas 数据框中删除所有的 NaN 值。

7
如果有任何元素与 nan 一起出现,则我希望保留元素并仅删除 nan,例如: 示例 1 ->
index      values
0     [nan,'a',nan,nan]

输出应该如下所示:

index   values

0         [a]

example 2->

index      values
0     [nan,'a',b,c]

1     [nan,nan,nan]

输出应该像这样。
index   values

0      [a,b,c]

1        [] 
4个回答

8
这是使用 df.apply 的一种方法。
import pandas as pd
import numpy as np

df = pd.DataFrame({"a": [[np.nan, np.nan, np.nan, "a", np.nan], [np.nan, np.nan], ["a", "b"]]})
df["a"] = df["a"].apply(lambda x: [i for i in x if str(i) != "nan"])
print(df)

输出:

        a
0     [a]
1      []
2  [a, b]

5
你可以利用 np.nan == np.nan 评估为 False 这一事实:
df = pd.DataFrame([[0, [np.nan, 'a', 'b', 'c']],
                   [1, [np.nan, np.nan, np.nan]],
                   [2, [np.nan, 'a', np.nan, np.nan]]],
                  columns=['index', 'values'])

df['values'] = df['values'].apply(lambda x: [i for i in x if i == i])

print(df)

   index     values
0      0  [a, b, c]
1      1         []
2      2        [a]

lambda 只是一个匿名函数。你也可以使用具名函数:

def remove_nan(x):
    return [i for i in x if i == i]

df['values'] = df['values'].apply(remove_nan)

相关: 为什么NaN不等于NaN?


1
谢谢你的回答。 请问Lambda函数在这里是如何工作的? i==i很难理解。 - Shubham Thagunna
@ShubhamThagunna,“lambda”是一个匿名函数。它定义了适用于序列中每个项目的逻辑。这里的项目是系列“df ['values']”的元素。请参见更新,以获取具有命名函数的等效内容。 - jpp

2
df['values'].apply(lambda v: pd.Series(v).dropna().values )

0
你可以在 df.values 上使用 pd.Series.map。
import pandas as pd
my_filter = lambda x: not pd.isna(x)
df['new_values'] = df['values'].map(lambda x: list(filter(my_filter, x)))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接