【发布时间】:2017-12-22 03:50:18
【问题描述】:
我意识到从数据帧中删除 NaNs 就像 df.dropna 一样简单,但由于某种原因,这对我来说不起作用,我不知道为什么。
这是我的原始数据框:
fish_frame1: 0 1 2 3 4 5 6 7
0 #0915-8 NaN NaN NaN NaN NaN NaN NaN
1 NaN NaN NaN LIVE WGT NaN AMOUNT NaN TOTAL
2 GBW COD NaN NaN 2,280 NaN $0.60 NaN $1,368.00
3 POLLOCK NaN NaN 1,611 NaN $0.01 NaN $16.11
4 WHAKE NaN NaN 441 NaN $0.70 NaN $308.70
5 GBE HADDOCK NaN NaN 2,788 NaN $0.01 NaN $27.88
6 GBW HADDOCK NaN NaN 16,667 NaN $0.01 NaN $166.67
7 REDFISH NaN NaN 932 NaN $0.01 NaN $9.32
8 GB WINTER FLOUNDER NaN NaN 145 NaN $0.25 NaN $36.25
9 GOM WINTER FLOUNDER NaN NaN 25,070 NaN $0.35 NaN $8,774.50
10 GB YELLOWTAIL NaN NaN 26 NaN $1.75 NaN $45.50
下面的代码试图删除所有 NaNs 以及任何超过 3 个 NaNs 的列(我认为其中一个或两个都应该有效):
fish_frame.dropna()
fish_frame.dropna(thresh=len(fish_frame) - 3, axis=1)
这会产生:
fish_frame1 after dropna: 0 1 2 3 4 5 6 7
0 #0915-8 NaN NaN NaN NaN NaN NaN NaN
1 NaN NaN NaN LIVE WGT NaN AMOUNT NaN TOTAL
2 GBW COD NaN NaN 2,280 NaN $0.60 NaN $1,368.00
3 POLLOCK NaN NaN 1,611 NaN $0.01 NaN $16.11
4 WHAKE NaN NaN 441 NaN $0.70 NaN $308.70
5 GBE HADDOCK NaN NaN 2,788 NaN $0.01 NaN $27.88
6 GBW HADDOCK NaN NaN 16,667 NaN $0.01 NaN $166.67
7 REDFISH NaN NaN 932 NaN $0.01 NaN $9.32
8 GB WINTER FLOUNDER NaN NaN 145 NaN $0.25 NaN $36.25
9 GOM WINTER FLOUNDER NaN NaN 25,070 NaN $0.35 NaN $8,774.50
10 GB YELLOWTAIL NaN NaN 26 NaN $1.75 NaN $45.50
我是 Pandas 的新手,所以我不确定这是否不起作用,因为我做错了什么,或者我误解了某些东西或滥用了某个功能。感谢任何帮助。
【问题讨论】:
-
.dropna()不会原地更改 DF - 它返回更改后的 DF...所以您要么必须将其分配回来,如:df = df.dropna()或明确使用inplace=True参数跨度> -
哦,我的错。明白了。考虑到我原来的
NaNs 有多少,我是否应该期望该命令生成一个空数据框? -
我认为您的第二个命令应该可以工作(因为它以列为目标),但第一个命令将删除带有
NaN的任何行 - 因为所有行中至少有一个 NaN,它将删除全部。 -
@MaxU: 最好说
dropna()默认情况下inplace=False所以你需要指定它;但如果你想就地做dropna(..., inplace=True) -
OP 当您说 “删除所有 NaN” 时,您的真正意思是 “删除所有 NaN 列”。这略有不同。
标签: python pandas dataframe in-place