我试图将数据框基于medical_plan_id
分成两个。如果为空,则进入df1
。如果不为空,请放入df2
。
df1 = df_with_medicalplanid[df_with_medicalplanid['medical_plan_id'] == ""]
df2 = df_with_medicalplanid[df_with_medicalplanid['medical_plan_id'] is not ""]
下面的代码有效,但是如果没有空字段,我的代码将引发TypeError("invalid type comparison")
。
df1 = df_with_medicalplanid[df_with_medicalplanid['medical_plan_id'] == ""]
如何处理这种情况?
我的df_with_medicalplanid如下所示:
wellthie_issuer_identifier ... medical_plan_id
0 UHC99806 ... None
1 UHC99806 ... None
答案 0 :(得分:7)
==
而不是is
来测试相等性同样,对于不等式,请使用!=
而不是is not
。
is
在Python中具有特殊含义。如果两个变量指向同一个对象,则返回True
,而==
检查变量所引用的对象是否相等。另请参见Is there a difference between ==
and is
in Python?。
您创建的布尔掩码是逻辑中最昂贵的部分。您要避免手动重复也是一种逻辑,因为您的第一个和第二个蒙版是彼此相反的。因此,可以使用bitwise inverse ~
(“波浪号”)(也可以通过operator.invert
访问)来否定现有的蒙版。
相等与空字符串可以通过== ''
进行测试,但是相等与空值需要一种专门的方法:pd.Series.isnull
。这是因为在NumPy数组中表示了空值,而NumPy数组由Pandas,np.nan
和np.nan != np.nan
by design使用。
如果要将空字符串替换为空值,可以这样做:
df['medical_plan_id'] = df['medical_plan_id'].replace('', np.nan)
从概念上讲,缺失值应为null(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
)和{{1 }}(True
)对应于您的遮罩的键:
== 1
然后,dfs = dict(tuple(df.groupby(df['medical_plan_id'].isnull())))
代表dfs[0]
,df2
代表dfs[1]
(另请参见this related answer)。上面的一种变体,您可以放弃字典的构建并使用Pandas df1
方法:
GroupBy
将以上所有内容付诸实践:
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
答案 1 :(得分:3)
另一种变种是解压缩df.groupby
,这将返回带有元组的迭代器(第一项是groupby的元素,第二项是数据帧)。
例如,像这样:
cond = df_with_medicalplanid['medical_plan_id'] == ''
(_, df1) , (_, df2) = df_with_medicalplanid.groupby(cond)
_
在Python中用于标记不希望保留的变量。为了便于阅读,我将代码分为两行。
完整示例
import pandas as pd
df_with_medicalplanid = pd.DataFrame({
'medical_plan_id': ['214212','','12251','12421',''],
'value': 1
})
cond = df_with_medicalplanid['medical_plan_id'] == ''
(_, df1) , (_, df2) = df_with_medicalplanid.groupby()
print(df1)
返回:
medical_plan_id value
0 214212 1
2 12251 1
3 12421 1