根据同一熊猫数据框中其他列的值创建包含布尔值或NaN的新列

时间:2019-05-01 00:11:24

标签: pandas

我想在pandas数据框中创建一个新列,该列的取值为True,False或NaN,具体取决于在同一数据框中的其他两个列中找到的值,这些值也仅包含True,False或NaN值。具体来说,如下所示,新列中的行值应为: (a)如果任一参考列值为True,则为True, (b)如果两个参考列的值均为False或它们是False和NaN的组合,则为False,或者 (c)如果两个参考列值均为NaN,则为NaN。

col_A + col_B => new_col(所需值)

  • 真+真=>真
  • 真+假=>真
  • 真+ NaN =>真
  • 假+假=>假
  • 假+ NaN =>假
  • NaN + NaN => NaN

最初,如下图所示,我尝试为col_A或col_B为True的新列分配值,但可以理解的是,只要其中一列或两列都包含NaN,它就会返回False。

df[new_col] = pd.isnull(df[col_A]) & pd.isnull(df[col_B]) 

我还想出了如何创建一列为col_A和col_B均为NaN的行返回True的列,但我仍在努力寻找下一步。

public static void compare(Book book1, Book book2){
    if(book1.getFinishedPercent() == book2.getFinishedPercent()){
        System.out.println("Wow, a tie!");
    }else{
      //other logic
    }
}

public static void main(String [] args) {

    Book book1 = new Book("Building Java Programs", "Stuart 
 Reges & Marty Stepp", 1194, 586);
    Book book2 = new Book("Java is hard","Brian May", 1334,  
 23);   
     compare(book1, book2);
 }

我觉得我最终可以使用for循环/ if语句来获得正确的输出,但是我的理解是这样做效率极低,而且似乎应该有一种更有效/直接的方法来获得结果,我在寻找。

1 个答案:

答案 0 :(得分:1)

使用.any

设置数据框:

dict = {
    'col_A': [True, True, True, False, False, False, np.NaN, np.NaN, np.NaN], 
    'col_B': [True, False, np.NaN, False, True, np.NaN, np.NaN,True, False]   
       }
df = pd.DataFrame(dict)

print(df)

   col_A  col_B
0   True   True
1   True  False
2   True    NaN
3  False  False
4  False   True
5  False    NaN
6    NaN    NaN
7    NaN   True
8    NaN  False

创建一个新列并将所有值设置为false。我们将填写其他值。

df['new_col'] = False

使用.any()填写剩余的True和NaN值。

df.loc[df[['col_A', 'col_B']].any(1), 'new_col'] = True

print(df)

   col_A   col_B   new_col
0   True   True     True
1   True  False     True
2   True    NaN     True
3  False  False    False
4  False   True     True
5  False    NaN    False
6    NaN    NaN    False
7    NaN   True     True
8    NaN  False    False