Pandas:删除所有 NaN 的列
Pandas: drop columns with all NaN's
我意识到从数据框中删除 NaN
s 和 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 [=11=].60 NaN ,368.00
3 POLLOCK NaN NaN 1,611 NaN [=11=].01 NaN .11
4 WHAKE NaN NaN 441 NaN [=11=].70 NaN 8.70
5 GBE HADDOCK NaN NaN 2,788 NaN [=11=].01 NaN .88
6 GBW HADDOCK NaN NaN 16,667 NaN [=11=].01 NaN 6.67
7 REDFISH NaN NaN 932 NaN [=11=].01 NaN .32
8 GB WINTER FLOUNDER NaN NaN 145 NaN [=11=].25 NaN .25
9 GOM WINTER FLOUNDER NaN NaN 25,070 NaN [=11=].35 NaN ,774.50
10 GB YELLOWTAIL NaN NaN 26 NaN .75 NaN .50
接下来的代码试图删除所有 NaN
以及任何超过 3 NaN
的列(我认为其中一个或两个都应该有效):
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 [=13=].60 NaN ,368.00
3 POLLOCK NaN NaN 1,611 NaN [=13=].01 NaN .11
4 WHAKE NaN NaN 441 NaN [=13=].70 NaN 8.70
5 GBE HADDOCK NaN NaN 2,788 NaN [=13=].01 NaN .88
6 GBW HADDOCK NaN NaN 16,667 NaN [=13=].01 NaN 6.67
7 REDFISH NaN NaN 932 NaN [=13=].01 NaN .32
8 GB WINTER FLOUNDER NaN NaN 145 NaN [=13=].25 NaN .25
9 GOM WINTER FLOUNDER NaN NaN 25,070 NaN [=13=].35 NaN ,774.50
10 GB YELLOWTAIL NaN NaN 26 NaN .75 NaN .50
我是 Pandas 的新手,所以我不确定这是否不起作用,因为我做错了什么,或者我误解了什么或误用了某个功能。感谢任何帮助。
dropna()
删除空值和 returns 数据帧。将其分配回原始数据帧。
fish_frame = fish_frame.dropna(axis = 1, how = 'all')
参考你的代码:
fish_frame.dropna(thresh=len(fish_frame) - 3, axis=1)
这将删除包含 7 个或更多 NaN 的列(假设 len(df) = 10),如果您想像您提到的那样删除包含 3 个以上 Nan 的列,则 thresh 应等于 3。
来自 dropna
文档字符串:
删除所有元素均为 NaN 的列:
df.dropna(axis=1, how='all')
A B D
0 NaN 2.0 0
1 3.0 4.0 1
2 NaN NaN 5
dropna()
默认情况下 returns 一个数据框(默认为 inplace=False
行为)因此需要分配给一个新的数据框以使其保留在您的代码中。
例如,
fish_frame = fish_frame.dropna()
至于您的 dropna
返回空数据帧的原因,我建议您查看 dropna 方法 (https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.dropna.html) 中的 "how" 参数。还要记住,axis=0 对应列,axis=1 对应行。
所以要删除所有 "NAs"、axis=0 的列,="any" 应该怎么做:
fish_frame = fish_frame.dropna(axis=0, how="any")
最后,"thresh" 参数明确指定了发生下降需要多少个 NA。所以
fish_frame = fish_frame.dropna(axis=0, thresh=3, how="any")
应该可以很好地删除任何具有三个 NA 的列。
此外,正如 Corley 指出的那样,how="any" 是默认设置,因此没有必要。
另一种解决方案是在非空位置创建一个具有真值的布尔数据框,然后获取至少具有一个真值的列。下一行删除所有 NaN 值的列。
df = df.loc[:,df.notna().any(axis=0)]
如果要删除至少有一个缺失 (NaN) 值的列;
df = df.loc[:,df.notna().all(axis=0)]
这种方法在删除包含空字符串、零或基本上任何给定值的列时特别有用。例如;
df = df.loc[:,(df!='').all(axis=0)]
删除至少有一个空字符串的列。
我意识到从数据框中删除 NaN
s 和 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 [=11=].60 NaN ,368.00
3 POLLOCK NaN NaN 1,611 NaN [=11=].01 NaN .11
4 WHAKE NaN NaN 441 NaN [=11=].70 NaN 8.70
5 GBE HADDOCK NaN NaN 2,788 NaN [=11=].01 NaN .88
6 GBW HADDOCK NaN NaN 16,667 NaN [=11=].01 NaN 6.67
7 REDFISH NaN NaN 932 NaN [=11=].01 NaN .32
8 GB WINTER FLOUNDER NaN NaN 145 NaN [=11=].25 NaN .25
9 GOM WINTER FLOUNDER NaN NaN 25,070 NaN [=11=].35 NaN ,774.50
10 GB YELLOWTAIL NaN NaN 26 NaN .75 NaN .50
接下来的代码试图删除所有 NaN
以及任何超过 3 NaN
的列(我认为其中一个或两个都应该有效):
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 [=13=].60 NaN ,368.00
3 POLLOCK NaN NaN 1,611 NaN [=13=].01 NaN .11
4 WHAKE NaN NaN 441 NaN [=13=].70 NaN 8.70
5 GBE HADDOCK NaN NaN 2,788 NaN [=13=].01 NaN .88
6 GBW HADDOCK NaN NaN 16,667 NaN [=13=].01 NaN 6.67
7 REDFISH NaN NaN 932 NaN [=13=].01 NaN .32
8 GB WINTER FLOUNDER NaN NaN 145 NaN [=13=].25 NaN .25
9 GOM WINTER FLOUNDER NaN NaN 25,070 NaN [=13=].35 NaN ,774.50
10 GB YELLOWTAIL NaN NaN 26 NaN .75 NaN .50
我是 Pandas 的新手,所以我不确定这是否不起作用,因为我做错了什么,或者我误解了什么或误用了某个功能。感谢任何帮助。
dropna()
删除空值和 returns 数据帧。将其分配回原始数据帧。
fish_frame = fish_frame.dropna(axis = 1, how = 'all')
参考你的代码:
fish_frame.dropna(thresh=len(fish_frame) - 3, axis=1)
这将删除包含 7 个或更多 NaN 的列(假设 len(df) = 10),如果您想像您提到的那样删除包含 3 个以上 Nan 的列,则 thresh 应等于 3。
来自 dropna
文档字符串:
删除所有元素均为 NaN 的列:
df.dropna(axis=1, how='all')
A B D
0 NaN 2.0 0
1 3.0 4.0 1
2 NaN NaN 5
dropna()
默认情况下 returns 一个数据框(默认为 inplace=False
行为)因此需要分配给一个新的数据框以使其保留在您的代码中。
例如,
fish_frame = fish_frame.dropna()
至于您的 dropna
返回空数据帧的原因,我建议您查看 dropna 方法 (https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.dropna.html) 中的 "how" 参数。还要记住,axis=0 对应列,axis=1 对应行。
所以要删除所有 "NAs"、axis=0 的列,="any" 应该怎么做:
fish_frame = fish_frame.dropna(axis=0, how="any")
最后,"thresh" 参数明确指定了发生下降需要多少个 NA。所以
fish_frame = fish_frame.dropna(axis=0, thresh=3, how="any")
应该可以很好地删除任何具有三个 NA 的列。
此外,正如 Corley 指出的那样,how="any" 是默认设置,因此没有必要。
另一种解决方案是在非空位置创建一个具有真值的布尔数据框,然后获取至少具有一个真值的列。下一行删除所有 NaN 值的列。
df = df.loc[:,df.notna().any(axis=0)]
如果要删除至少有一个缺失 (NaN) 值的列;
df = df.loc[:,df.notna().all(axis=0)]
这种方法在删除包含空字符串、零或基本上任何给定值的列时特别有用。例如;
df = df.loc[:,(df!='').all(axis=0)]
删除至少有一个空字符串的列。