如果有任何元素与nan一起存在,那么我想保留元素并只想删除nan
示例1->
index values
0 [nan,'a',nan,nan]
输出应该像
index values
0 [a]
示例2->
index values
0 [nan,'a',b,c]
1 [nan,nan,nan]
输出应该像
index values
0 [a,b,c]
1 []
答案 0 :(得分:4)
这是使用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]
答案 1 :(得分:2)
您可以使用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)
答案 2 :(得分:1)
df['values'].apply(lambda v: pd.Series(v).dropna().values )
答案 3 :(得分:0)
您可以在pd.Series.map
上使用df.values
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)))