我想在pandas数据框中创建一个新列,该列的取值为True,False或NaN,具体取决于在同一数据框中的其他两个列中找到的值,这些值也仅包含True,False或NaN值。具体来说,如下所示,新列中的行值应为: (a)如果任一参考列值为True,则为True, (b)如果两个参考列的值均为False或它们是False和NaN的组合,则为False,或者 (c)如果两个参考列值均为NaN,则为NaN。
col_A + col_B => new_col(所需值)
最初,如下图所示,我尝试为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语句来获得正确的输出,但是我的理解是这样做效率极低,而且似乎应该有一种更有效/直接的方法来获得结果,我在寻找。
答案 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