【问题标题】:Exclude rows that have empty cell排除具有空单元格的行
【发布时间】:2019-01-07 12:42:48
【问题描述】:

我尝试排除没有“UID”的行。 我试过了

temp = pd.read_csv(link)
temp = temp[temp['UID'].notnull()]

没有用。我又试了,

temp = temp[temp['UID']!='null']

它也没有工作。

这里是 jupyter notebook 形式的输出。

screenshot of the output

【问题讨论】:

  • 我怀疑 NaN 与 null 不同。并且“nan”与 NaN 不同
  • temp = temp[temp['UID']!='null'] 正在检查字符串 'null'

标签: python pandas csv numpy


【解决方案1】:

你需要:

temp = temp[temp['UID'].notna()]

【讨论】:

    【解决方案2】:

    您可以使用pd.notnull

    例如:

    In:
    import pandas as pd
    import numpy as np
    d = {'col1': [1, 2,np.nan,8], 'col2': [np.nan, 4,7,11]}
    df = pd.DataFrame(data=d)
    df
    
    Out:
        col1    col2
    0   1.0 NaN
    1   2.0 4.0
    2   NaN 7.0
    3   8.0 11.0
    
    In:
    df = df[pd.notnull(df['col1'])]
    df
    
    Out:
        col1    col2
    0   1.0 NaN
    1   2.0 4.0
    3   8.0 11.0
    

    【讨论】:

      【解决方案3】:

      有问题nan是字符串,所以可能的解决方案是:

      temp = temp[temp['UID']!='nan']
      

      或者:

      temp = temp.replace('nan', np.nan)
      temp = temp[temp['UID'].notnull()]
      

      类似的:

      temp = temp.dropna(subset=['UID'])
      

      【讨论】:

        【解决方案4】:

        当您读取 CSV 文件时尝试解决问题。例如,"nan" 很可能被空格包围,因此无法正确读取为NaN。您可能需要在文本编辑器中检查 CSV 文件以确定是否是这种情况。

        然后您可以通过pd.read_csv 处理意外的空白。例如:

        import pandas as pd
        from io import StringIO
        
        x = StringIO("""UID,col2,col3
        nan ,1,2
        3,4,5
        NaN,6,7""")
        
        df = pd.read_csv(x, sep=' *, *', engine='python')
        
        print(df)
        
           UID  col2  col3
        0  NaN     1     2
        1  3.0     4     5
        2  NaN     6     7
        

        如果没有sep 参数,"nan" 将无法正确读取为NaN

        df1 = pd.read_csv(x)
        
        print(df1)
        
            UID  col2  col3
        0  nan      1     2
        1     3     4     5
        2   NaN     6     7
        

        有关更多替代方案,请参阅How can I remove extra whitespace from strings when parsing a csv file in Pandas?。一旦读取数据为NaN,您可以通过pd.Series.notnull排除相关行:

        df = df[df['UID'].notnull()]
        

        【讨论】:

          【解决方案5】:

          pd dropna 助你一臂之力

          df.dropna(subset=['optional_column_arg']]
          

          pd.dropna documentation

          【讨论】:

            猜你喜欢
            • 2011-02-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-10-16
            • 1970-01-01
            • 2019-11-26
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多