具有一组定义的有效值,所有熊猫数据框列值都应设置为给定值,例如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
答案 0 :(得分:2)
您可以使用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
需要注意的几点:
pd.Series.isin
与list
相比,set
的工作效率更高。另请参见Pandas pd.Series.isin performance with set versus array。float
视为NaN
,因此您的序列必须转换为float
。inplace=True
时,该操作不需要分配给变量。答案 1 :(得分:2)
为什么不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