将定义集中的值设置为 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.isinlist 相比,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)的主要内容,如果未能解决你的问题,请参考以下文章

如何将sqlalchemy中列的默认值设置为关系中列的值?

更改数据框中列的元素并合并列

Python-Pandas。根据列表中列的存在重新分配列的值

如何更改pyspark数据框中列的顺序?

我可以更改 Spark 数据框中列的可空性吗?

将 postgres 中列的值更新为小写