基于条件拆分数据帧

2024-09-29 19:22:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图将我的数据帧分成两个基于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")。在

^{pr2}$

如何处理这种情况?在

我的df_with_medicalplanid如下所示:

wellthie_issuer_identifier       ...       medical_plan_id
0                   UHC99806       ...                  None
1                   UHC99806       ...                  None

Tags: 数据代码noneiddfiswithnot
2条回答

另一个变体是解压缩df.groupby,它返回一个带有元组的迭代器(第一项是groupby的元素,第二项是dataframe)。在

比如这样:

cond = df_with_medicalplanid['medical_plan_id'] == ''
(_, df1) , (_, df2) = df_with_medicalplanid.groupby(cond)

_在Python中用于标记不感兴趣的变量。为了便于阅读,我把代码分成两行。在


完整示例

^{pr2}$

退货:

  medical_plan_id  value
0          214212      1
2           12251      1
3           12421      1

使用==,而不是is,来测试等式

同样,用!=代替is not来表示不等式。在

is在Python中有特殊的含义。如果两个变量指向同一个对象,则返回True,而==则检查变量所引用的对象是否相等。另请参见Is there a difference between ^{} and ^{} in Python?。在

不要重复掩码计算

您正在创建的布尔掩码是逻辑中最昂贵的部分。这也是一个逻辑,你想避免手动重复,因为你的第一个和第二个掩模是相反的。因此,您可以使用bitwise inverse~(“tilde”),也可以通过^{}访问,来否定现有的掩码。在

空字符串与空值不同

相等与空字符串可以通过== ''进行测试,但是相等与空值需要一个特殊的方法:^{}。这是因为空值是在NumPy数组中表示的,Pandas使用这些数组,np.nannp.nan != np.nanby design。在

如果要用空值替换空字符串,可以执行以下操作:

df['medical_plan_id'] = df['medical_plan_id'].replace('', np.nan)

从概念上讲,丢失的值应该是null(np.nan),而不是空字符串。但与上述过程相反,也可以将空值转换为空字符串:

^{pr2}$

如果差异很重要,您需要了解数据并应用适当的逻辑。在

半成品溶液

假设您确实有空值,请计算单个布尔掩码及其逆值:

mask = df['medical_plan_id'].isnull()

df1 = df[mask]
df2 = df[~mask]

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

作为一个程序员,你应该避免创建额外的变量。在这种情况下,不需要创建两个新变量,您可以使用GroupBydict来给出一个数据帧字典,其中False== 0)和{}(== 1)键对应的数据帧字典:

dfs = dict(tuple(df.groupby(df['medical_plan_id'].isnull())))

dfs[0]表示df2dfs[1]表示{}(另请参见this related answer)。作为上述方法的变体,您可以放弃字典构造,使用PandasGroupBy方法:

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

示例

将上述各项付诸行动:

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

相关问题 更多 >

    热门问题