3

具有一组已定义的有效值,其中的所有 pandas 数据框列值都应设置为给定值 fe 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
4

2 回答 2

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.isinlist与 a相比,将更有效地工作set。另请参阅Pandas pd.Series.isin 与 set 与 array 的性能
  • 您的系列将必然转换为,float因为NaN被考虑float
  • 该操作在使用时不需要分配给变量inplace=True
于 2018-08-08T08:48:24.227 回答
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
于 2018-08-08T08:54:00.940 回答