gpt4 book ai didi

python - 根据条件拆分数据框

转载 作者:太空狗 更新时间:2023-10-30 01:56:28 25 4
gpt4 key购买 nike

我正在尝试根据 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 there a difference between == and is in Python?

不要重复掩码计算

您正在创建的 bool 掩码是逻辑中最昂贵的部分。这也是您要避免手动重复的逻辑,因为您的第一个和第二个掩码是彼此相反的。因此,您可以使用 bitwise inverse ~(“代字号”)(也可通过 operator.invert 访问)来否定现有掩码。

空字符串不同于空值

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

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

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

从概念上讲,缺失值是 null (np.nan) 而不是空字符串是有意义的。但是与上述过程相反,即将 null 值转换为空字符串也是可能的:

df['medical_plan_id'] = df['medical_plan_id'].fillna('')

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

半决赛方案

假设你确实有空值,计算一个 bool 掩码及其逆:

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

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

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

作为程序员,您应该避免创建额外的变量。在这种情况下,无需创建两个新变量,您可以将 GroupBydict 一起使用,以提供带有 False (== 0) 和 True (== 1) 键对应于你的掩码:

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

然后 dfs[0] 代表 df2dfs[1] 代表 df1 (另见 this related answer ) .上述的变体,您可以放弃字典构建并使用 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

关于python - 根据条件拆分数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52966811/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com