熊猫:删除满足条件的值

时间:2020-12-27 18:36:47

标签: python pandas dataframe

假设我有这样的数据:

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

3 个答案:

答案 0 :(得分:4)

使用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

答案 1 :(得分:0)

一种方法是为不符合删除标准的值创建掩码。

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

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

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

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

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

答案 2 :(得分:0)

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

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