<h3>使用<code>==</code>,而不是<code>is</code>,来测试等式</h3>
<p>同样,用<code>!=</code>代替<code>is not</code>来表示不等式。在</p>
<p><code>is</code>在Python中有特殊的含义。如果两个变量指向同一个对象,则返回<code>True</code>,而<code>==</code>则检查变量所引用的对象是否相等。另请参见<a href="https://stackoverflow.com/questions/132988/is-there-a-difference-between-and-is-in-python">Is there a difference between ^{<cd1>} and ^{<cd2>} in Python?</a>。在</p>
<h3>不要重复掩码计算</h3>
<p>您正在创建的布尔掩码是逻辑中最昂贵的部分。这也是一个逻辑,你想避免手动重复,因为你的第一个和第二个掩模是相反的。因此,您可以使用<a href="https://stackoverflow.com/questions/8305199/the-tilde-operator-in-python">bitwise inverse</a><code>~</code>(“tilde”),也可以通过<a href="https://docs.python.org/3/library/operator.html#operator.inv" rel="nofollow noreferrer">^{<cd11>}</a>访问,来否定现有的掩码。在</p>
<h3>空字符串与空值不同</h3>
<p>相等与空字符串可以通过<code>== ''</code>进行测试,但是相等与空值需要一个特殊的方法:<a href="https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.isnull.html" rel="nofollow noreferrer">^{<cd13>}</a>。这是因为空值是在NumPy数组中表示的,Pandas使用这些数组,<code>np.nan</code>,<code>np.nan != np.nan</code><a href="https://stackoverflow.com/a/1573715/9209546">by design</a>。在</p>
<p>如果要用空值替换空字符串,可以执行以下操作:</p>
<pre><code>df['medical_plan_id'] = df['medical_plan_id'].replace('', np.nan)
</code></pre>
<p>从概念上讲,丢失的值应该是null(<code>np.nan</code>),而不是空字符串。但与上述过程相反,也可以将空值转换为空字符串:</p>
^{pr2}$
<p>如果差异很重要,您需要了解数据并应用适当的逻辑。在</p>
<h3>半成品溶液</h3>
<p>假设您确实有空值,请计算单个布尔掩码及其逆值:</p>
<pre><code>mask = df['medical_plan_id'].isnull()
df1 = df[mask]
df2 = df[~mask]
</code></pre>
<h3>最终解决方案:避免额外变量</h3>
<p>作为一个程序员,你应该避免创建额外的变量。在这种情况下,不需要创建两个新变量,您可以使用<code>GroupBy</code>和<code>dict</code>来给出一个数据帧字典,其中<code>False</code>(<code>== 0</code>)和{<cd6>}(<code>== 1</code>)键对应的数据帧字典:</p>
<pre><code>dfs = dict(tuple(df.groupby(df['medical_plan_id'].isnull())))
</code></pre>
<p>则<code>dfs[0]</code>表示<code>df2</code>,<code>dfs[1]</code>表示{<cd26>}(另请参见<a href="https://stackoverflow.com/a/52947460/9209546">this related answer</a>)。作为上述方法的变体,您可以放弃字典构造,使用Pandas<code>GroupBy</code>方法:</p>
<pre><code>dfs = df.groupby(df['medical_plan_id'].isnull())
dfs.get_group(0) # equivalent to dfs[0] from dict solution
dfs.get_group(1) # equivalent to dfs[1] from dict solution
</code></pre>
<h3>示例</h3>
<p>将上述各项付诸行动:</p>
<pre><code>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
</code></pre>