假设我有这样的数据:
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
答案 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('')