将定义集中的值设置为 Pandas 数据框中列的给定值(f.e. NaN)
Posted
技术标签:
【中文标题】将定义集中的值设置为 Pandas 数据框中列的给定值(f.e. NaN)【英文标题】:Set the values out of the defined set to a given value (f.e. NaN) for a column in pandas data frame 【发布时间】:2019-01-15 11:04:46 【问题描述】:拥有一组已定义的有效值,其中的所有 pandas 数据框列值都应设置为给定值 f.e. 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
【问题讨论】:
【参考方案1】:你可以使用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
时,该操作不需要分配给变量。
【讨论】:
【参考方案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
【讨论】:
以上是关于将定义集中的值设置为 Pandas 数据框中列的给定值(f.e. NaN)的主要内容,如果未能解决你的问题,请参考以下文章