熊猫 - NaN的专栏

时间:2017-07-17 14:38:13

标签: python pandas dataframe

我意识到从数据框中删除NaN就像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

下面的代码是尝试删除所有NaN以及任何超过3 NaN s的列(我认为应该是一个或两个):

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的新手所以我不确定这是否有效,因为我做错了什么或者我误解了某些事情或误用了命令。任何帮助表示赞赏谢谢。

4 个答案:

答案 0 :(得分:10)

应该是评论,但无论如何,来自dropna docstring:

    Drop the columns where all elements are 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

答案 1 :(得分:2)

dropna()删除空值并返回dataFrame。将其分配回原始dataFrame。

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.

答案 2 :(得分:2)

dropna返回一个数据帧,因此需要分配给一个新的数据帧,以便它保留在您的代码中。

例如,

fish_frame = fish_frame.dropna()

至于你的dropna返回空数据帧的原因,我建议你看一下dropna方法中的“how”参数(https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.dropna.html)。还要记住,axis = 0对应于列,而axis = 1对应于行。

所以要删除所有“NAs”的列,axis = 0,how =“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指出的那样,=“any”是默认值,因此不是必需的。

答案 3 :(得分:1)

另一种解决方案是在非空位置创建一个具有 True 值的布尔数据框,然后采用至少具有一个 True 值的列。下一行删除包含所有 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)]

删除至少有一个空字符串的列。