根据条件拆分数据框

时间:2018-10-24 10:36:00

标签: python pandas

我试图将数据框基于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

2 个答案:

答案 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.nannp.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]

最终解决方案:避免使用额外的变量

创建其他变量是需要注意的事情,作为程序员,您应该避免这样做。在这种情况下,无需创建两个新变量,可以将GroupBydict结合使用,以提供包含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