我用python代码创建了一个包含两个特性的数据框:

data_df = {"Age" : [10, 20, 30, 40, 50, np.NaN, np.NaN, np.NaN, np.NaN],
           "Name" : ["A", "B", "C", "D", "E", "F", "G", "H", "I"]}
data_df = pd.DataFrame(data_df)
data_df.head(7)
Age Name
0 10.0 A
1 20.0 B
2 30.0 C
3 40.0 D
4 50.0 E
5 NaN F
6 NaN G

现在我想将所有的Name值替换为NA,其中age也是NA,所以我使用for循环,如下所示:

am_decision = []

for (x,y) in zip(data_df['Age'],data_df['Name']):
    if x == np.NaN:
        am_decision.append(np.NaN)
    else:
        am_decision.append(y)
print(len(am_decision))
print(am_decision) 

输出==9

正如您所见,上面的for循环代码不起作用.我错过了什么吗?

推荐答案

对于测试缺失值,使用pandas.isna:

am_decision = []

for (x,y) in zip(data_df['Age'],data_df['Name']):
    if pd.isna(x):
        am_decision.append(np.NaN)
    else:
        am_decision.append(y)
print(len(am_decision))
print(am_decision) 
['A', 'B', 'C', 'D', 'E', nan, nan, nan, nan]

非循环解决方案更快更简单-使用Series.maskSeries.isna:

out = data_df['Name'].mask(data_df['Age'].isna())
print (out)
0      A
1      B
2      C
3      D
4      E
5    NaN
6    NaN
7    NaN
8    NaN
Name: Name, dtype: object

out = data_df['Name'].mask(data_df['Age'].isna()).tolist()
print (out)
['A', 'B', 'C', 'D', 'E', nan, nan, nan, nan]

Python相关问答推荐

仅使用2种 colored颜色 创建热图

隐藏QComboBox的指示器(qdarkstyle)

如何在Pygame中绘制右对齐的文本?

在Python中,如何才能/应该使用decorator 来实现函数多态性?

如何用symy更新分段函数

在Pandas框架中截短至固定数量的列

计算所有前面行(当前行)中列的值

Python中MongoDB的BSON时间戳

使用plotnine和Python构建地块

@Property方法上的inspect.getmembers出现意外行为,引发异常

如何使用symy打印方程?

连接两个具有不同标题的收件箱

SQLGory-file包FilField不允许提供自定义文件名,自动将文件保存为未命名

ModuleNotFound错误:没有名为Crypto Windows 11、Python 3.11.6的模块

Telethon加入私有频道

Pandas—在数据透视表中占总数的百分比

如何根据一列的值有条件地 Select 前N个组,然后按两列分组?

Pandas Loc Select 到NaN和值列表

在Python中调用变量(特别是Tkinter)

如何在Great Table中处理inf和nans