【发布时间】:2020-09-10 04:26:34
【问题描述】:
我有一只熊猫DataFramedf
L C
0 [1, 2, 3] 5
1 [4, nan, 6] 0
2 [nan, nan, nan] 15
还有一个DataFrameother
C
0 0
1 25
2 0
然后我将 other 附加到 df 并在 L 列中添加 3 行具有 NaN 值。
L C
0 [1, 2, 3] 5
1 [4, nan, 6] 0
2 [nan, nan, nan] 15
0 NaN 0
1 NaN 25
2 NaN 0
我想创建一个列,如果 L 列是 NaN 并且 C 是 0 那么它将获得价值 1 否则它将获得价值 0。我还使用不包含 NaN 值的行进行计算,但这超出了本文的目的。
我发现 Pandas 处理Nan 值的方式是pd.isna()。
我创建了函数
def check_cols(L, C):
if pd.isna(L) and C == 0:
return 1
elif pd.isna(L) and C != 0:
return 0
我在每一行都应用这个函数
df['col'] = df.apply(lambda row: check_cols(row.L,row.C), axis=1)
但我得到了错误
具有多个元素的数组的真值是不明确的。使用 a.any() 或 a.all()
因为它检查列表中的每个元素是否为NaN。我不想检查列表的元素是否有NaN,我想检查是否有一个列表(即使所有元素都是nan)或NaN 值。另一种方法是使用pd.isna() 像这样创建一个列
L C is_NaN
0 [1, 2, 3] 5 False
1 [4, nan, 6] 0 False
2 [nan, nan, nan] 15 False
0 NaN 0 True
1 NaN 25 True
2 NaN 0 True
然后将三列作为函数的参数,这将起作用。我想做同样的检查,如果有一个列表,如果有一个 NaN 值,在函数内,而不必创建额外的列。
如果有人能解释为什么在第一种情况下它会检查列表的每个元素,而在第二种情况下它会进行我想要的检查,和/或提供一些来源,那就太好了。
【问题讨论】:
标签: python pandas dataframe multiple-columns nan