根据条件分割数据框[英] Splitting a dataframe based on condition

本文是小编为大家收集整理的关于根据条件分割数据框的处理方法,想解了根据条件分割数据框的问题怎么解决?根据条件分割数据框问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我正在尝试根据 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

推荐答案

使用 == 而不是 is 来测试相等性

同样,使用 != 代替 is not 表示不等式.

is 在 Python 中有特殊的含义.如果两个变量指向同一个对象,则返回 True,而 == 检查变量引用的对象是否相等.另请参阅 == 和 is 之间是否有区别在 Python 中?.

不要重复掩码计算

您正在创建的布尔掩码是您的逻辑中最昂贵的部分.这也是您希望避免手动重复的逻辑,因为您的第一个和第二个掩码彼此相反.因此,您可以使用 按位逆 ~ ("tilde"),也可以访问通过 operator.invert,否定现有掩码.

空字符串不同于空值

可以通过 == '' 测试相等与空字符串,但相等与空值需要一个专门的方法:pd.Series.isnull.这是因为空值在 NumPy 数组中表示,由 Pandas 使用,由 np.nan 和 np.nan != np.nan 按设计.

如果你想用空值替换空字符串,你可以这样做:

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) 和 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)  # 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

本文地址:https://www.itbaoku.cn/post/1728108.html