具有一组定义的有效值,所有 pandas 数据框列值都应设置为给定值,例如NaN
.可以假定集合和数据框中包含的值为数值类型。
设置了以下有效值和数据框:
valid = {5, 22}
df = pd.DataFrame({'a': [5, 1, 7, 22],'b': [12, 3 , 10, 9]})
a b
0 5 12
1 1 3
2 7 10
3 22 9
在列a
上设置有效值将导致:
a b
0 5 12
1 NaN 3
2 NaN 10
3 22 9
您可以使用pd.Series.where
:
df['a'].where(df['a'].isin(valid), inplace=True)
print(df)
a b
0 5.0 12
1 NaN 3
2 NaN 10
3 22.0 9
需要注意的几点:
- 与
set
相比,pd.Series.isin
在list
下将更有效地工作。另见熊猫pd。Series.isin 性能与集合与数组。 - 您的系列必然会转换为
float
,因为NaN
被认为是float
。 - 使用
inplace=True
时,该操作不需要赋值变量。
为什么不isin
:
df.loc[~df['a'].isin(valid),'a']=pd.np.nan
示例:
import pandas as pd
valid = {5, 22}
df = pd.DataFrame({'a': [5, 1, 7, 22],'b': [12, 3 , 10, 9]})
df.loc[~df['a'].isin(valid),'a']=pd.np.nan
print(df)
输出:
a b
0 5.0 12
1 NaN 3
2 NaN 10
3 22.0 9