【问题标题】:Pandas: Remove values that meet conditionPandas:删除符合条件的值
【发布时间】:2020-12-28 02:46:40
【问题描述】:

假设我有这样的数据:

df = pd.DataFrame({'category': ["blue","red","blue", "blue","green"], 'val1': [5, 3, 2, 2, 5], 'val2':[1, 3, 2, 2, 5], 'val3': [2, 1, 1, 4, 3]})
print(df)

  category  val1  val2  val3
0     blue     5     1     2
1      red     3     3     1
2     blue     2     2     1
3     blue     2     2     4
4    green     5     5     3

如何在不删除整行或移动列的情​​况下删除(或替换为例如 NaN)满足特定条件的值?

假设我的条件是我想从上述数据中删除所有低于 3 的值,结果应该是这样的:

  category  val1  val2  val3
0     blue     5     
1      red     3     3     
2     blue     
3     blue                 4
4    green     5     5     3

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    使用mask:

    df.iloc[:, 1:] = df.iloc[:, 1:].mask(df.iloc[:, 1:] < 3)
    print(df)
    

    输出

      category  val1  val2  val3
    0     blue   5.0   NaN   NaN
    1      red   3.0   3.0   NaN
    2     blue   NaN   NaN   NaN
    3     blue   NaN   NaN   4.0
    4    green   5.0   5.0   3.0
    

    如果您想设置特定值,例如0,请执行以下操作:

    df.iloc[:, 1:] = df.iloc[:, 1:].mask(df.iloc[:, 1:] < 3, 0)
    print(df)
    

    输出

      category  val1  val2  val3
    0     blue     5     0     0
    1      red     3     3     0
    2     blue     0     0     0
    3     blue     0     0     4
    4    green     5     5     3
    

    如果你只需要几列,你可以这样做:

    df[['val1', 'val2', 'val3']] = df[['val1', 'val2', 'val3']].mask(df[['val1', 'val2', 'val3']] < 3)
    print(df)
    

    输出

      category  val1  val2  val3
    0     blue   5.0   NaN   NaN
    1      red   3.0   3.0   NaN
    2     blue   NaN   NaN   NaN
    3     blue   NaN   NaN   4.0
    4    green   5.0   5.0   3.0
    

    【讨论】:

      【解决方案2】:

      一种方法是为不符合删除条件的值创建一个掩码。

      mask = df[['val1','val2','val3']] > 3
      

      然后您可以创建一个新的 df,即未删除的 val。

      updated_df = df[['val1','val2','val3']][mask]
      

      您需要在未受影响的列中重新添加。

      updated_df['category'] = df['category']
      

      【讨论】:

        【解决方案3】:

        您可以对包含整数的列使用 applymap 或转换。

        df[df.iloc[:,1:].transform(lambda x: x>=3)].fillna('')
        

        【讨论】:

          猜你喜欢
          • 2019-08-31
          • 2017-10-08
          • 2019-06-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-07-14
          • 2020-08-06
          相关资源
          最近更新 更多