无法在 pandas 中使用 dropna 删除 NAN

问题描述 投票:0回答:5

我将 pandas 导入为 pd 并运行下面的代码并得到以下结果

代码:

traindataset = pd.read_csv('/Users/train.csv')
print traindataset.dtypes
print traindataset.shape
print traindataset.iloc[25,3]
traindataset.dropna(how='any')
print traindataset.iloc[25,3]
print traindataset.shape

输出

TripType                   int64  
VisitNumber                int64  
Weekday                   object  
Upc                      float64  
ScanCount                  int64  
DepartmentDescription     object  
FinelineNumber           float64  
dtype: object

(647054, 7)

nan  
nan

(647054, 7) 
[Finished in 2.2s]

从结果来看,dropna 行不起作用,因为行号没有改变并且数据框中仍然存在 NAN。这是怎么来的?我现在很疯狂。

python pandas dataframe missing-data
5个回答
34
投票

您需要阅读文档(强调已添加):

返回给定轴上带有标签的对象被省略

dropna
返回一个数据帧。 如果您希望它修改现有的 DataFrame,您所要做的就是进一步阅读文档:

inplace:布尔值,默认False

如果为 True,则就地操作并返回 None。

因此要就地修改它,请执行

traindataset.dropna(how='any', inplace=True)


20
投票

pd.DataFrame.dropna
默认使用
inplace=False
。这是大多数 Pandas 操作的常态;例外情况确实存在,例如
update
.

因此,您必须分配回变量,明确声明

inplace=True

df = df.dropna(how='any')           # assign back
df.dropna(how='any', inplace=True)  # set inplace parameter

从风格上讲,前者通常是首选,因为它支持运算符链接,而后者通常不会产生任何或显着的性能优势


7
投票

或者,您也可以使用

notnull()
方法来选择不是
null
的行。

例如,如果您想从数据框评论的

null
country
列中选择非
variety
值:

answer=reviews.loc[(reviews.country.notnull()) & (reviews.variety.notnull())]

但这里我们只是选择相关数据;要删除

null
值,您应该使用
dropna()
方法。


7
投票

这是我的第一篇文章。我刚刚花了几个小时调试这个确切的问题,我想分享我如何解决这个问题。

我将整个数据帧转换为字符串,然后使用与下面显示的类似的代码将该值放回到数据帧中:(请注意,下面的代码只会将值转换为字符串)

row_counter = 0
for ind, row in dataf.iterrows():
    cell_value = str(row['column_header'])
    dataf.loc[row_counter, 'column_header'] = cell_value
    row_counter += 1

将整个数据帧转换为字符串后,我使用了

dropna()
函数。之前的值
NaN
(被 pandas 视为空值)被转换为字符串
'nan'

总之,在开始操作 CSV 中的数据并转换其数据类型之前,请先删除空白值。


0
投票

看起来 NaN 有一些尾随或前导的空字符。删除这些空字符后,df.dropna() 会删除其中包含 NaN 的行。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.