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")
.
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
解决方案
使用==
, notis
来测试相等性
同样,使用!=
而不是is not
表示不等式。
is
在 Python 中有特殊的含义。True
如果两个变量指向同一个对象,则返回,同时==
检查变量引用的对象是否相等。另请参阅Python和Python之间有区别吗?==
is
.
不要重复掩码计算
您正在创建的布尔掩码是您的逻辑中最昂贵的部分。这也是您希望避免手动重复的逻辑,因为您的第一个和第二个掩码彼此相反。因此,您可以使用也可以通过 访问的按位反转 ~
(“波浪号”)operator.invert
来否定现有掩码。
空字符串不同于空值
相等与空字符串可以通过 测试== ''
,但相等与空值需要一个专门的方法:pd.Series.isnull
. 这是因为 null 值在 NumPy 数组中表示,这些数组被 Pandas、bynp.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
withdict
来提供数据帧字典,其中False
( == 0
) 和True
( == 1
) 键对应于您的掩码:
dfs = dict(tuple(df.groupby(df['medical_plan_id'].isnull())))
然后dfs[0]
表示df2
和dfs[1]
表示df1
(另请参见此相关答案)。上述的一种变体,您可以放弃字典构建并使用 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
推荐阅读
- ffmpeg - 使用 FFMpeg 时如何在双引号内分隔引号、双引号和冒号
- visual-studio - 添加 fontawesome svgs 后,Visual Studio 构建速度变慢
- python - 将具有任意行数的输入文件写入制表符分隔的输出
- javascript - 当我在 axios 的拦截器中时如何忽略回调?
- c++ - 如何将转换应用于条件运算符中的位域类型?
- azure-active-directory - OWIN 在 Azure 中停止运行
- linux - 将带有转义字符的文本从 Jenkins 传递到 Groovy 脚本
- c# - 错误 #CS0029“无法在 Visual Studio 中将类型 'void' 隐式转换为 'string'
- selenium - 使用 ChromeDriver 启动 Google Chrome 时,如何隐藏 URL 栏中显示的初步“数据:”?
- javascript - 如何在 javascript 数组中搜索关键字?