【问题标题】:Print the colname and rowname for values that meet certain condition打印满足特定条件的值的列名和行名
【发布时间】:2020-11-12 19:54:28
【问题描述】:

我正在拼命想弄清楚如何为我的 df 中的特定值打印行索引和列名。

我有以下df:

raw_data = {'first_name': [NaN, 'Molly', 'Tina', 'Jake', 'Amy'], 
        'last_name': ['Miller', 'Jacobson', 'Ali', 'Milner', 'Cooze'], 
        'age': [42, 52, NaN, 24, 73], 
        'preTestScore': [4, 24, 31, 33, 3],
        'postTestScore': [25, 94, 57, 62, 70]}

df = pd.DataFrame(raw_data, columns = ['first_name', 'last_name', 'age', 
'preTestScore','postTestScore'])

我现在想打印出 NaN 的索引和列名:

There is a missing value in row 0 for first_name.
There is a missing value in row 2 for age.

我进行了很多搜索,总是找到如何为一行做某事。 我的想法是先用 False 和 True 创建一个 df

na = df.isnull()

然后我想应用一些函数来打印每个 NaN 值的行号和 col_name。 我就是不知道该怎么做。

提前感谢您的帮助!

【问题讨论】:

  • 你可能有错误:NameError: name 'NaN' is not defined?

标签: python pandas dataframe


【解决方案1】:

由于NaN,不得不稍微更改 df。替换为np.nan

import numpy as np
import pandas as pd
raw_data = {'first_name': [np.nan, 'Molly', 'Tina', 'Jake', 'Amy'], 
        'last_name': ['Miller', 'Jacobson', 'Ali', 'Milner', 'Cooze'], 
        'age': [42, 52, np.nan, 24, 73], 
        'preTestScore': [4, 24, 31, 33, 3],
        'postTestScore': [25, 94, 57, 62, 70]}

你可以这样做

dfs = df.stack(dropna = False)
[f'There is a missing value in row {i[0]} for {i[1]}' for i in dfs[dfs.isna()].index]

打印一个列表

['There is a missing value in row 0 for first_name',
 'There is a missing value in row 2 for age']

【讨论】:

    【解决方案2】:

    就这么简单:

    np.where(df.isnull())
    

    它返回一个带有行索引的元组,以及分别带有NAs 的列索引。


    例子:

    na_idx = np.where(df.isnull())
    for i,j in zip(*na_idx):
        print(f'Row {i} and column {j} ({df.columns[j]}) is NA.')
    

    【讨论】:

      【解决方案3】:

      您可以执行以下操作:

      for i, row in df.iterrows():
          nans = row[row.isna()].index
          for n in nans:
              print('row: %s, col: %s' % (i, n))
      

      【讨论】:

        【解决方案4】:

        我认为融化是要走的路。

        我将首先创建一个包含以下列的数据框:索引、列名、值。 然后过滤列value 不为空。 并将结果转储到 dict。

        df = pd.melt(df.reset_index(), id_vars=['index'], value_vars=df.columns)
        selected = df[df['value'].isnull()].drop('value', axis=1).set_index('index')
        resp = selected.T.to_dict(orient='records')[0]
        s = "There is a missing value in row {idx} for {col_name}."
        
        for record in resp.items():
            idx, col_name = record
            print(s.format(idx=idx, col_name=col_name))
        

        【讨论】:

          【解决方案5】:

          你可以创建一个变量 NaN = "空" 表示空单元格

          
          import pandas as  pd
          
          NaN = "null"
          raw_data = {'first_name': [NaN, 'Molly', 'Tina', 'Jake', 'Amy'], 
                  'last_name': ['Miller', 'Jacobson', 'Ali', 'Milner', 'Cooze'], 
                  'age': [42, 52, NaN, 24, 73], 
                  'preTestScore': [4, 24, 31, 33, 3],
                  'postTestScore': [25, 94, 57, 62, 70]}
          
          df = pd.DataFrame(raw_data, columns = ['first_name', 'last_name', 'age', 
          'preTestScore','postTestScore'])
          print(df)
          
          

          输出:

          first_name last_name   age  preTestScore  postTestScore
          0       null    Miller    42             4             25
          1      Molly  Jacobson    52            24             94
          2       Tina       Ali  null            31             57
          3       Jake    Milner    24            33             62
          4        Amy     Cooze    73             3             70
          

          【讨论】:

          • 这不是一个好主意。你宁愿使用 pandas 理解的 nans ......要么使用 np.nan 要么使用 float('nan')
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-05-13
          • 2021-06-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多