首页 > 解决方案 > 有条件地操作数据框

问题描述

我有以下数据我正在尝试执行以下操作;

  1. 如果 tag_3 和 tag_4 中的元素是“NaN”,则返回具有以下列的中间 df:tag_0、tag_1 和 tag_2。
  2. 如果 tag_4 中的元素仅为“NaN”,则返回另一个中间 df,其中包含以下列:tag_0、tag_2、tag_3。
  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'])

虚拟数据

标签: python-3.xpandasdataframe

解决方案


我喜欢在 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'

推荐阅读