使用==
而不是is
来测试相等性
同样,对于不等式,请使用!=
而不是is not
。
is
在Python中有特殊的含义。如果两个变量指向同一对象,则返回True
,而==
检查变量所引用的对象是否相等。另请参见在Python中==
和is
有什么区别吗?。
不要重复计算掩码
您正在创建的布尔掩码是逻辑中最昂贵的部分。这也是您想要避免手动重复的逻辑,因为您的第一个和第二个掩码互为反转。因此,您可以使用按位反转~
(“波浪号”),也可通过operator.invert
访问,来否定现有掩码。
空字符串与空值不同
相对于空字符串,可以通过
== ''
进行测试,但是与 null 值的比较需要使用专门的方法:
pd.Series.isnull
。这是因为在 Pandas 中使用的 NumPy 数组中,null 值由
np.nan
表示,而
np.nan != np.nan
是设计如此。
如果您想用 null 值替换空字符串,可以这样做:
df['medical_plan_id'] = df['medical_plan_id'].replace('', np.nan)
从概念上讲,缺失值应该是空值(np.nan
)而不是空字符串。但是,将空值转换为空字符串的反向过程也是可能的:
df['medical_plan_id'] = df['medical_plan_id'].fillna('')
如果差异很重要,你需要了解你的数据并应用适当的逻辑。
半终极解决方案
假设你确实有空值,请计算一个布尔掩码及其反码:
mask = df['medical_plan_id'].isnull()
df1 = df[mask]
df2 = df[~mask]
最终解决方案:避免额外变量
作为程序员,创建额外变量是应该避免的。在这种情况下,你不需要创建两个新变量,你可以使用GroupBy
和dict
来给出一个数据帧字典,其中False
(== 0
)和True
(== 1
)键对应于你的掩码:
dfs = dict(tuple(df.groupby(df['medical_plan_id'].isnull())))
那么
dfs[0]
代表
df2
,
dfs[1]
代表
df1
(也可以参考
这个相关答案)。以上方法的变体是,您可以放弃字典构建,使用Pandas
GroupBy
方法:
dfs = df.groupby(df['medical_plan_id'].isnull())
dfs.get_group(0)
dfs.get_group(1)
示例
将以上所有内容付诸实践:
df = pd.DataFrame({'medical_plan_id': [np.nan, '', 2134, 4325, 6543, '', np.nan],
'values': [1, 2, 3, 4, 5, 6, 7]})
df['medical_plan_id'] = df['medical_plan_id'].replace('', np.nan)
dfs = dict(tuple(df.groupby(df['medical_plan_id'].isnull())))
print(dfs[0], dfs[1], sep='\n'*2)
medical_plan_id values
2 2134.0 3
3 4325.0 4
4 6543.0 5
medical_plan_id values
0 NaN 1
1 NaN 2
5 NaN 6
6 NaN 7
is not
to!=
? - Ivan Vinogradov'medical_plan_id'
的数据类型是什么?如果它是整数或浮点数,则与""进行比较会导致类型错误。您可以尝试使用.isnull()
代替。 - doctorer