Pandas Lambda功能与Nan支持

时间:2017-05-19 04:42:36

标签: python python-3.x pandas lambda nan

我正在尝试在Pandas中编写一个lambda函数,检查Col1是否为Nan,如果是,则使用另一列的数据。我无法获得正确编译/执行的代码(如下所示)。

import pandas as pd
import numpy as np
df=pd.DataFrame({ 'Col1' : [1,2,3,np.NaN], 'Col2': [7, 8, 9, 10]})  
df2=df.apply(lambda x: x['Col2'] if x['Col1'].isnull() else x['Col1'], axis=1)

有没有人对如何使用lambda函数编写这样的解决方案有任何好主意,或者我是否超出了lambda的能力?如果没有,你有其他解决方案吗?感谢。

4 个答案:

答案 0 :(得分:10)

如果标量为$sqlFindId = "SELECT language_id FROM language_skill WHERE person_id = :person_id AND language_learning = :language_learning AND language_id = :language_id"; $NoEmptyArray_language_id = ""; foreach ($teachArray as $dataTeach) { $query = $handler->prepare($sqlFindUser); $query->bindValue(':person_id', $_SESSION['person_id']); $query->bindValue(':language_learning', 1); $query->bindValue(':language_id', $dataTeach); $query->execute(); $language_id = $query->fetchAll(PDO::FETCH_COLUMN, 0); if ( count( $language_id ) != 0 ) { $NoEmptyArray_language_id .= $language_id; } } print_r($NoEmptyArray_language_id); ,则需要pandas.isnull进行检查:

NaN

但更好的是使用Series.combine_first

df = pd.DataFrame({ 'Col1' : [1,2,3,np.NaN],
                 'Col2' : [8,9,7,10]})  

df2 = df.apply(lambda x: x['Col2'] if pd.isnull(x['Col1']) else x['Col1'], axis=1)

print (df)
   Col1  Col2
0   1.0     8
1   2.0     9
2   3.0     7
3   NaN    10

print (df2)
0     1.0
1     2.0
2     3.0
3    10.0
dtype: float64

Series.update的另一个解决方案:

df['Col1'] = df['Col1'].combine_first(df['Col2'])

print (df)
   Col1  Col2
0   1.0     8
1   2.0     9
2   3.0     7
3  10.0    10

答案 1 :(得分:4)

假设您确实有第二列,那就是:

df = pd.DataFrame({ 'Col1' : [1,2,3,np.NaN], 'Col2': [1,2,3,4]})

这个问题的正确解决方案是:

df['Col1'].fillna(df['Col2'], inplace=True)

答案 2 :(得分:0)

您需要使用np.nan()

#import numpy as np
df2=df.apply(lambda x: 2 if np.isnan(x['Col1']) else 1, axis=1)   

df2
Out[1307]: 
0    1
1    1
2    1
3    2
dtype: int64

答案 3 :(得分:0)

我在熊猫0.24.2内使用

df.apply(lambda x: x['col_name'] if x[col1] is np.nan else expressions_another, axis=1)

因为pd.isnull()不起作用。

在我的工作中,我发现了以下现象,

无运行结果:

df['prop'] = df.apply(lambda x: (x['buynumpday'] / x['cnumpday']) if pd.isnull(x['cnumpday']) else np.nan, axis=1)

结果存在:

df['prop'] = df.apply(lambda x: (x['buynumpday'] / x['cnumpday']) if x['cnumpday'] is not np.nan else np.nan, axis=1)