在其他列中基于NaN的Python新列

时间:2015-01-30 20:34:05

标签: python pandas boolean nan nonetype

我对Python很陌生,这是我的第一个问题所以请温柔地对待我!

我已经尝试过其他类似问题的答案,但仍然很困难。

我正在使用Pandas,我有一个数据框,它是来自多个不同SQL表的合并,看起来像这样:

Col_1   Col_2   Col_3   Col_4
1       NaN     NaN     NaN
2       Y       NaN     NaN
3       Z       C       S
4       NaN     B       W

我不关心Col_2 Col_3和Col_4中的值(注意这些值可以是字符串,也可以是整数或对象,具体取决于列)

我只关心这些列中至少有一列是填充的,所以理想情况下会喜欢第五列:

Col_1   Col_2   Col_3   Col_4   Col_5
1       NaN     NaN     NaN     0
2       Y       NaN     NaN     1
3       Z       C       S       1
4       NaN     B       W       1

然后我想将Col_2列放到Col_4。

我最初的想法类似于下面的函数,但这会将我的数据帧从50000行减少到50.我不想删除任何行。

def function(row):
   if (isnull.row['col_2'] and isnull.row['col_3'] and isnull.row['col_3'] is None):
      return '0'
   else:
      return '1'

df['col_5'] = df.apply(lambda row: function (row),axis=1)

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:4)

使用any并传递param axis=1,它会逐行测试,这将生成一个布尔数组,当转换为int时,会将所有True值转换为1和{ {1}}值为False,这比调用0快得多,后者将逐行迭代并且速度非常慢:

apply

以下是In [30]: df['Col_5'] = any(df[df.columns[1:]].notnull(), axis=1).astype(int) df Out[30]: Col_1 Col_2 Col_3 Col_4 Col_5 0 1 NaN NaN NaN 0 1 2 Y NaN NaN 1 2 3 Z C S 1 3 4 NaN B W 1 In [31]: df = df[['Col_1', 'Col_5']] df Out[31]: Col_1 Col_5 0 1 0 1 2 1 2 3 1 3 4 1 的输出:

any

<强>计时

In [34]:

any(df[df.columns[1:]].notnull(), axis=1)
Out[34]:
array([False,  True,  True,  True], dtype=bool)

因此,对于df这个大小的测试数据,我的方法比其他答案快2倍

<强>更新

当您运行pandas版本In [35]: %timeit df[df.columns[1:]].apply(lambda x: all(x.isnull()) , axis=1).astype(int) %timeit any(df[df.columns[1:]].notnull(), axis=1).astype(int) 100 loops, best of 3: 2.46 ms per loop 1000 loops, best of 3: 1.4 ms per loop 时,您需要调用顶级notnull版本,因为该方法在df级别不可用:

0.12.0

我建议您升级,因为您将获得更多功能和错误修复。

答案 1 :(得分:0)

使用函数:

df['col_5'] =df.apply(lambda x: all(x.isnull()) , axis=1)

我的钱更容易阅读。不确定哪个更快。