【问题标题】:Set a pandas column Boolean value based on other columns in the row根据行中的其他列设置 pandas 列布尔值
【发布时间】:2019-12-27 06:57:50
【问题描述】:

假设一个数据帧

    C1      C2      C3
1   NaN     NaN     NaN
2   20.1    15      200
3   NaN     12      100
4   22.5    8       80

我想根据行其余部分的汇总布尔值创建一个新列。例如,是否有任何值 NaN?在这种情况下,我的新列值为该行的“False”。

或者,也许,所有的值都是 NaN?在这种情况下,我可能希望新列显示为 False,否则为 True(我们确实有一些值)

我考虑使用df.notnan() 创建一个布尔数据框,

    C1      C2      C3
1   False   False   False
2   True    True    True
3   False   True    True
4   True    True    True

我确定我只是遗漏了一些简单的东西,但我想不出一种方法来基于对每一行中的现有项目进行 OR-ing 来创建第四列。

另外,一个通用的解决方案会很好,不需要构建一个临时的布尔值 DF。

背景:我有一个数据集。营养值只是偶尔采样,因此许多行不包含这些值。我想要一个“Nutrients Sampled”列,其中的值为 True 或 False,具体取决于我是否可以期望在此记录中看到任何营养样本数据。有 6 种可能的营养素,我不想检查所有 6 列。

我可以编写检查所有 6 列的代码;我似乎无法创建一个具有真值的新列。

【问题讨论】:

标签: python pandas dataframe


【解决方案1】:

怎么样:

# interim df
df = {"C1": [False, True, False, True], ...
df ["C4"] = df.apply(lambda x: x.C1 or x.C2 or X.C3, axis=1)

或者...直接作为

original_df["C4"] = original_df.apply(lambda x: np.any(np.isnan(x)), axis = 1)

问候,

【讨论】:

    【解决方案2】:

    您可以使用数据框上可用的anyall 方法来做到这一点,只需传递参数axis=1 即可进行操作

    示例:

    df['C4'] = pd.notnull(df).any(axis=1)
    
         C1    C2     C3     C4
    0   NaN   NaN    NaN  False
    1  20.1  15.0  200.0   True
    2   NaN  12.0  100.0   True
    3  22.5   8.0   80.0   True
    

    【讨论】:

    • 但是如果我只关心 C2 和 C3,我该怎么做呢?
    • 您可以列出您关心的列,例如mycols=['C2', 'C3'],然后对子集应用语句df['C4'] = pd.notnull(df[mycols]).any(1)
    【解决方案3】:

    我觉得我们应该使用all

    df['New']=~df.isna().all(1)
    df
         C1    C2     C3    New
    1   NaN   NaN    NaN  False
    2  20.1  15.0  200.0   True
    3   NaN  12.0  100.0   True
    4  22.5   8.0   80.0   True
    

    【讨论】:

      【解决方案4】:

      您可以使用apply 方法并定义一个函数来将行映射到布尔值。

      这里有一个函数,你可以根据自己的需要自定义(比如你可以用all代替any):

      # if at least one of the values is NaN
      def my_function(row):
          return any(row[['C1', 'C2', 'C3']].isna())
      

      下面是如何将它应用到您的数据框并添加新列:

      df['new_column'] = df.apply(my_function, axis=1)
      
          C1      C2      C3      new_column
      0   NaN     NaN     NaN     True
      1   20.1    15.0    200.0   False
      2   NaN     12.0    100.0   True
      3   22.5    8.0     80.0    False
      

      【讨论】:

        猜你喜欢
        • 2019-08-02
        • 2020-07-23
        • 1970-01-01
        • 1970-01-01
        • 2019-02-27
        • 2022-09-27
        • 2020-11-04
        • 1970-01-01
        • 2020-02-06
        相关资源
        最近更新 更多