【问题标题】:Pandas: Remove all NaN values in all columns [duplicate]Pandas:删除所有列中的所有 NaN 值 [重复]
【发布时间】:2018-10-29 07:13:58
【问题描述】:

我有一个包含许多空记录的数据框:

Col_1    Col_2      Col_3
10         5          2
22         7          7
3         9          5       
4         NaN       NaN
5         NaN       NaN
6         4         NaN
7         6          7
8         10        NaN
12        NaN        1

我想删除所有列中的所有 NaN 值。如您所见,每一列都有不同的行数。所以,我想得到这样的东西:

Col_1    Col_2      Col_3
10         5          2
22         7          7
3          9          5       
4          4          7
6          6          1
7         10          
8                 
12    

我试过了

filtered_df = df.dropna(how='any')

但它会删除数据框中的所有记录。我该怎么做?

【问题讨论】:

  • 但是你希望剩下的元素是什么? DataFrame 必须具有相同数量的元素。
  • 查看我回答的第二部分,但使用“up”而不是“left”
  • @coldspeed 我不太确定您在另一个问题中的答案或其与此问题的相关性。 DataFrames 用于表格数据。如果数据是参差不齐的矩阵,则可能不是正确的数据结构。
  • @AmiTavory 很公平,如何处理事情可能并不明显,所以我重新打开了这个问题并回答了它。
  • 您知道,如果您的问题得到了回答,您可以投票,并在此处将最有帮助的答案标记为已接受(单击答案左侧的灰色复选标记将其切换为绿色)。

标签: python pandas dataframe nan


【解决方案1】:

你也可以试试这个

censos_data.dropna(subset=censos_data.columns,inplace=True)

【讨论】:

【解决方案2】:

如您所见,每一列都有不同的行数。

DataFrame 是一种表格数据结构:您可以查找索引和列,并找到值。如果每列的行数不同,则索引是无意义的且具有误导性。 dict 可能是更好的选择:

{c: df[c].dropna().values for c in df.columns}

或

{c: list(df[c]) for c in df.columns}

【讨论】:

  • 我完全 100% 同意这里的每一个字。我只是认为大多数像这样的家务问题都是由显示/表示引发的,我认为这样的问题是可以的。否则,建议在这里哄 OP 发现 XY 问题中的 X...:)...
【解决方案3】:

您也可以在系列列表中使用pd.concat。

请注意,由于NaN 元素,列Col_2 和Col_3 不可避免地是float,如果您删除dtype=object 作为选项。

res = pd.concat([df[x].dropna().reset_index(drop=True) for x in df], axis=1)

print(res)

   Col_1  Col_2  Col_3
0     10    5.0    2.0
1     22    7.0    7.0
2      3    9.0    5.0
3      4    4.0    7.0
4      5    6.0    1.0
5      6   10.0    NaN
6      7    NaN    NaN
7      8    NaN    NaN
8     12    NaN    NaN

【讨论】:

    【解决方案4】:

    使用 Divakar 的 justify 函数——

    df[:] = justify(df.values, invalid_val=np.nan, axis=0, side='up')
    df = df.fillna('')
    

    print(df)
    
       Col_1 Col_2 Col_3
    0   10.0     5     2
    1   22.0     7     7
    2    3.0     9     5
    3    4.0     4     7
    4    5.0     6     1
    5    6.0    10      
    6    7.0            
    7    8.0            
    8   12.0            
    

    【讨论】:

    • 技术水平令人印象深刻。从根本上说,出于我在回答中概述的原因,我不太喜欢它。
    猜你喜欢
    • 2017-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-20
    • 2017-05-11
    • 2021-03-08
    • 2016-11-25
    • 2021-12-13
    相关资源
    最近更新 更多