当比较Pandas Dataframe 中的两个布尔序列时,如何返回一个新序列,该序列包括前两个序列中的所有NA,并倾向于True值

xwbd5t1u  于 2023-02-11  发布在  其他
关注(0)|答案(2)|浏览(140)

我一直在尝试解决一个问题,那就是从"before"和"after"列的操作中获取"desired_final"列。

df = pd.DataFrame({
    'before': pd.Series([True, True, True, False, False, False, pd.NA, pd.NA, pd.NA], dtype='boolean'),
    'after': pd.Series([False, True, pd.NA, True, False, pd.NA, False, True, pd.NA], dtype='boolean'),
    'desired_final': pd.Series([True, True, True, True, False, False, pd.NA, pd.NA, pd.NA], dtype='boolean')
})

基本上,我们倾向于True,除非before + after为False,或者其中之一为NA。
终于想到了这个,我认为,hacky解决方案,但我犹豫把它投入生产。

def hack_solution(before_series, after_series):
    output_series = before_series.replace(True, pd.NA) + after_series
    return output_series.fillna(before_series)

我也曾在朋友的建议下尝试过:

def possible_solution(before_series, after_series):
    res = []
    for x,y in zip(before_series, after_series):
        if pd.isnull(x): 
            res.append(pd.NA)
        elif x==True | y==True:
            res.append(True)
        else:
            res.append(x)
    return res

# Result:
# [True, True, True, False, False, False, <NA>, <NA>, <NA>] dtype: object

所以有两个问题:
1.为什么possible_solution返回一个对象而hack_solution返回一个布尔值?
1.为什么在索引3中,possible_solution返回False而不是True?

3yhwsihp

3yhwsihp1#

对于possible_solution,您需要将它们放在一个括号中:

False == True | True == True
# False

(False == True) | (True == True)
# True

您可以直接使用pandas.Series.fillna

desired = df["before"] + df["after"].fillna(df["before"])
print(desired)

输出:

0     True
1     True
2     True
3     True
4    False
5    False
6     <NA>
7     <NA>
8     <NA>
dtype: boolean
jutyujz0

jutyujz02#

您可以尝试:

df['desired'] = (df[['before','after']].fillna(False)
                    .any(axis=1)
                    .where(df['before'].notna(), pd.NA)
                )

希望你能解释清楚。

相关问题