在 pandas 中删除 nan 行的更好方法

Posted

技术标签:

【中文标题】在 pandas 中删除 nan 行的更好方法【英文标题】:better way to drop nan rows in pandas 【发布时间】:2016-07-22 02:48:07 【问题描述】:

我自己找到了一种从 pandas 数据框中删除 nan 行的方法。给定一个数据框dat,其列x 包含nan 值,有没有更优雅的方法来删除dat 的每一行,它在x 列中有一个nan 值?

dat = dat[np.logical_not(np.isnan(dat.x))]
dat = dat.reset_index(drop=True)

【问题讨论】:

你的意思是pd.dropna() 看起来会起作用的 【参考方案1】:

使用dropna:

dat.dropna()

如果所有标签都是 nan 或任何标签都是 nan,您可以传递参数 how 来删除

dat.dropna(how='any')    #to drop if any value in the row has a nan
dat.dropna(how='all')    #to drop if all values in the row are nan

希望能回答您的问题!

编辑 1: 如果您只想从特定列中删除包含 nan 值的行,正如 J. Doe 在下面的回答中所建议的那样,您可以使用以下内容:

dat.dropna(subset=[col_list])  # col_list is a list of column names to consider for nan values.

【讨论】:

【参考方案2】:

如果您想删除“x”具体为 nan 的行,要扩展 Hitesh 的答案,您可以使用子集参数。他的回答会删除其他列也有 nan 的行

dat.dropna(subset=['x'])

【讨论】:

【参考方案3】:

以防万一先前答案中的命令不起作用, 尝试这个: dat.dropna(subset=['x'], inplace = True)

【讨论】:

是的,pandas 默认是 inplace=False,需要记住【参考方案4】:
bool_series=pd.notnull(dat["x"])
dat=dat[bool_series]

【讨论】:

代码总是好的,但它也有助于添加一些关于此代码如何回答原始问题的 cmets/context。 请编辑您的答案以添加对您的代码如何工作以及它如何解决 OP 问题的解释。许多 *** 用户是新手,不会理解您发布的代码,因此不会从您的回答中学习。【参考方案5】:

根据特定列的 Nan 值删除行:

d= pd.DataFrame([[2,3],[4,None]])   #creating data frame
d
Output:
    0   1
0   2   3.0
1   4   NaN
d = d[np.isfinite(d[1])]  #Select rows where value of 1st column is not nan
d

Output:
    0   1
0   2   3.0

【讨论】:

以上是关于在 pandas 中删除 nan 行的更好方法的主要内容,如果未能解决你的问题,请参考以下文章

pandas删除nan数据,筛选出nan的数据,筛选出非nan的数据,替换nan值

在 scipy/pandas 中用 Pearson 的 r 删除 'nan'

Pandas:仅在数据帧的开头和结尾删除 NaN

使用 NaN 在 pandas 中按列对数据进行 Winsorizing

如何从 dtype 为列表的 Pandas 系列中删除 NaN?

从 pandas 转换为 numpy 后,如果数组包含 nan,则删除“nan”或减少 numpy 数组的长度 [重复]