我将 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。这是怎么来的?我现在很疯狂。
您需要阅读文档(强调已添加):
返回给定轴上带有标签的对象被省略
dropna
返回一个新数据帧。 如果您希望它修改现有的 DataFrame,您所要做的就是进一步阅读文档:
inplace:布尔值,默认False
如果为 True,则就地操作并返回 None。
因此要就地修改它,请执行
traindataset.dropna(how='any', inplace=True)
。
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
从风格上讲,前者通常是首选,因为它支持运算符链接,而后者通常不会产生任何或显着的性能优势。
或者,您也可以使用
notnull()
方法来选择不是 null
的行。
例如,如果您想从数据框评论的
null
和 country
列中选择非 variety
值:
answer=reviews.loc[(reviews.country.notnull()) & (reviews.variety.notnull())]
但这里我们只是选择相关数据;要删除
null
值,您应该使用 dropna()
方法。
这是我的第一篇文章。我刚刚花了几个小时调试这个确切的问题,我想分享我如何解决这个问题。
我将整个数据帧转换为字符串,然后使用与下面显示的类似的代码将该值放回到数据帧中:(请注意,下面的代码只会将值转换为字符串)
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 中的数据并转换其数据类型之前,请先删除空白值。
看起来 NaN 有一些尾随或前导的空字符。删除这些空字符后,df.dropna() 会删除其中包含 NaN 的行。