【问题标题】:Python: How to find which values in a column have NaN values in another specific column (dataframes)Python:如何查找列中的哪些值在另一个特定列(数据框)中具有 NaN 值
【发布时间】:2019-04-27 02:17:46
【问题描述】:

假设我们有df1,看起来像这样:

x1 = [{'partner': "Afghanistan", 'commodity': NaN}, 
      {'partner': "Zambia",      'commodity': 2}, 
      {'partner': "Germany",     'commodity': 2},
      {'partner': "Afghanistan", 'commodity': NaN},
      {'partner': "Canada",      'commodity': NaN},
      {'partner': "Italy",       'commodity': 3},
      {'partner': "Canada",      'commodity': NaN},
      {'partner': "USA",         'commodity': NaN}]

df1 = pd.DataFrame(x1)

我想要做的是查看partner 中具有NaN 值的值列表commodity,但我不想将相同的partner 列出两次。

所以我的首选结果如下所示:

commodity_nan_partners=
Afghanistan
Canada
USA

而不是:

Afghanistan
Afghanistan
Canada
Canada
USA

【问题讨论】:

    标签: python pandas dataframe multiple-columns nan


    【解决方案1】:

    您可以使用isnull 查找NaN 值,然后使用uniqueset 获取唯一值:

    >>> pd.Series(df1.loc[df1.commodity.isnull(),'partner'].unique())
    0    Afghanistan
    1         Canada
    2            USA
    dtype: object
    
    # or
    >>> pd.Series(list(set(df1.loc[df1.commodity.isnull(),'partner'])))
    0         Canada
    1    Afghanistan
    2            USA
    dtype: object
    

    【讨论】:

      【解决方案2】:

      loc + isnull + drop_duplicates

      您可以过滤您的系列,然后删除重复项:

      res = df1.loc[df1['commodity'].isnull(), 'partner'].drop_duplicates()
      
      print(res)
      
      0    Afghanistan
      4         Canada
      7            USA
      Name: partner, dtype: object
      

      【讨论】:

        【解决方案3】:

        第 1 步
        过滤掉只保留有效的字符串:

        v = df1.loc[df1.commodity.isna(), 'partner']
        

        或者,

        v = df1.partner[df1.commodity.isna()]
        

        print(v)
        0    Afghanistan
        3    Afghanistan
        4         Canada
        6         Canada
        7            USA
        Name: partner, dtype: object
        

        第 2 步
        删除重复项。

        如果你想要收藏,

        ingredients.unique()
        array(['Afghanistan', 'Canada', 'USA'], dtype=object)
        

        或者,

        set(ingredients)
        {'Afghanistan', 'Canada', 'USA'}
        

        如果你想要一个系列,

        ser = ingredients.drop_duplicates().reset_index(drop=True)
        
        0    Afghanistan
        1         Canada
        2            USA
        Name: partner, dtype: object
        

        如果你想要一个 DataFrame,

        df = ser.to_frame()
        

        【讨论】:

          【解决方案4】:

          可以与dropna 联系,在这里提供一个不同的想法。

          set(df1.partner.tolist())-set(df1.dropna().partner.tolist())
          Out[94]: {'Afghanistan', 'Canada', 'USA'}
          

          【讨论】:

            【解决方案5】:

            只是另一种选择:

            >>> df1[df1.isnull().any(axis=1)]['partner'].drop_duplicates()
            0    Afghanistan
            4         Canada
            7            USA
            Name: partner, dtype: object
            

            使用loc + np.isnan

            >>> df1.loc[np.isnan(df1.commodity), 'partner'].drop_duplicates()
            0    Afghanistan
            4         Canada
            7            USA
            Name: partner, dtype: object
            

            【讨论】:

              猜你喜欢
              • 2020-04-14
              • 2016-07-13
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多