pandas 如果筛选列后生成的 Dataframe 为空,则将变量分配给none

xqkwcwgp  于 2022-11-27  发布在  其他
关注(0)|答案(2)|浏览(146)

我尝试在包含空值或整数的列z中获取值:

df = pd.DataFrame({'X': [1, 2, 3, 4],
                    'Y': [2, 10, 13, 18],
                  'Z': [3, None, 5, None]})

a = df[(df.X == 1) & (df.Y == 2)].Z.item()
print(a)
#output: 3

b = df[(df.X == 7) & (df.Y == 18)].Z.item()
print(b)
#output: error

它抛出一个值错误:只能将大小为1的数组转换为Python标量。因为过滤X和Y列得到的数据框是空的。如果数据框是空的,我想将变量b赋给None
我尝试了以下方法,效果很好:

#checking the length of the dataframe
b = df[(df.X == 1) & (df.Y == 2)].Z.item() if (len(df[(df.X == 7) & (df.Y == 18)]) == 1) else None
print(b)
# output: None

有没有更好的办法?

arknldoa

arknldoa1#

另一种方法是使用next(..., None),如果迭代器为空,则返回None:

b = next(iter(df[(df.X == 7) & (df.Y == 18)].Z), None)
print(b)
# None
w8f9ii69

w8f9ii692#

两件事-你的结果是空的,因此error -.item()显然在空的pd.Series上抛出了一个错误。第二,实现你所追求的目标的更规范的方法是:

>>> b = df.loc[(df.X == 7) & (df.Y == 18), "Z"].values
>>> if len(b) == 0: b=None
...

还可防止产生错误.item()

相关问题