python-3.x - 有条件地操作数据框
问题描述
我有以下数据我正在尝试执行以下操作;
- 如果 tag_3 和 tag_4 中的元素是“NaN”,则返回具有以下列的中间 df:tag_0、tag_1 和 tag_2。
- 如果 tag_4 中的元素仅为“NaN”,则返回另一个中间 df,其中包含以下列:tag_0、tag_2、tag_3。
- 最后,如果所有列都具有非 NaN 值,则返回具有以下列的中间 df:tag_0、tag_3、tag_4。
数据:
data = {'tag_0': ['1', '2', '3'],
'tag_1': ['4', '5', '6'],
'tag_2': ['7', '8', '9'],
'tag_3': ['NaN', '10', '11'],
'tag_4': ['NaN', 'NaN', '12']}
df_1 = pd.DataFrame(data, columns = ['tag_0', 'tag_1', 'tag_2', 'tag_3', 'tag_4'])
解决方案
我喜欢在 pandas 中使用布尔掩码来完成这类任务,因为我认为它很容易阅读,但还有其他方法可以解决。
什么是布尔掩码?
布尔掩码本质上是一个Series
真/假值,应用于 aDataFrame
以对其进行过滤。
第 1 步:创建Series
真/假值。
tag_3_is_nan = df['tag3'].isna()
tag_4_is_nan = df['tag4'].isna()
第 2 步:将它们应用于DataFrame
df[bool_mask]
在您的情况下,这将使用以下逻辑应用。
情况 1:如果 tag_3 和 tag_4 中的元素是“NaN”,则返回一个包含以下列的中间 df:tag_0、tag_1 和 tag_2。
df[tag_3_is_nan & tag_4_is_nan][['tag_0', 'tag_1', 'tag_2']]
情况 2:如果 tag_4 中的元素仅为“NaN”,则返回另一个中间 df,其中包含以下列:tag_0、tag_2、tag_3。
df[tag_4_is_nan & ~tag_3_is_nan][['tag_0', 'tag_2', 'tag_3']]
~
等于not
- 所以意味着tag_3~tag_3_is_nan
不是 nan。
情况 3:最后,如果所有列都具有非 NaN 值,则返回具有以下列的中间 df:tag_0、tag_3、tag_4。
在 pandas 中删除所有包含至少一个 NaN 值的行很简单 - 只需使用该方法dropna()
df.dropna()[['tag_0', 'tag_3', 'tag_4']]
- 为避免
settingWithCopyWarning
下线,您应该复制过滤后的df
.
以上使用None
,但您的示例'NaN'
用作string
. 如果您的数据包含字符串'NaN'
而不是实际的None
.
tag_3_is_nan_string = df['tag3'] == 'NaN'
推荐阅读
- python - 如何重塑numpy数组以将行变成列
- python - 除了块内的logger.error导致程序停止运行?
- python - 在哪里可以找到 python 中 bog 标准异常类的原始代码
- pytorch - cuda.amp 和 model.half() 有什么区别?
- python - 一个 python 脚本循环一个变量并运行其他 3 个使用该变量的脚本
- python - 将元素的值分配给变量输出
- javascript - 在 Javascript 实时搜索中显示“未找到结果”?
- r - R - 迭代数据帧以分离输出(3个迭代器)
- r - 如何将数据框拆分为具有相互排斥因素的组
- mysql - 窗口功能不可用mysql 8