Pandas — Найти пустые столбцы строки и обновить в одном столбце

#python #python-3.x #pandas #dataframe

#python #python-3.x #pandas #фрейм данных

Вопрос:

Ниже приведен код для чтения значений Excel

 import pandas as pd
import numpy as np
import os

df = pd.read_excel(os.path.join(os.getcwd(), 'TestData.xlsx'))
print(df)
  

Данные Excel являются

     Employee ID First Name Last Name    Contact Technology  Comment
0            1   KARTHICK      RAJU  9500012345       .NET      
1            2       TEST            9840112345       JAVA      
2            3                 TEST  9145612345        AWS      
3            4                       9123498765     Python      
4            5       TEST      TEST  9156478965              
  

Приведенный ниже код возвращает, True если какая-либо ячейка содержит empty value

 print(df.isna())
  

как показано ниже

    Employee ID  First Name  Last Name  Contact  Technology  Comment
0        False       False      False    False       False     True
1        False       False       True    False       False     True
2        False        True      False    False       False     True
3        False        True       True    False       False     True
4        False       False      False    False        True     True
  

Я хочу добавить комментарий для каждой строки, как показано ниже

 Comment

Last Name is empty
First Name is empty
First Name and Last Name are empty
Technology is empty
  

Один из способов сделать это — выполнить итерацию по каждой строке, чтобы найти пустой индекс и на основе индекса comments может быть обновлен.

Если таблица содержит огромные данные, итерация может оказаться не очень хорошей идеей

Есть ли способ добиться этого более питоническим способом?

Ответ №1:

Вы можете упростить решение и установить is и are использовать - , используя умножение матрицы DataFrame.dot с булевой маской и столбцами с новым значением, последний разделитель удалить на DataFrame.dot :

 #if column exist
df = df.drop('Comment', axis=1)

df['Comment'] = df.isna().dot(df.columns   '-empty, ').str.rstrip(', ')
print (df)
   Employee ID First Name Last Name     Contact Technology  
0            1   KARTHICK      RAJU  9500012345       .NET   
1            2       TEST       NaN  9840112345       JAVA   
2            3        NaN      TEST  9145612345        AWS   
3            4        NaN       NaN  9123498765     Python   
4            5       TEST      TEST  9156478965        NaN   

                             Comment  
0                                     
1                    Last Name-empty  
2                   First Name-empty  
3  First Name-empty, Last Name-empty  
4                   Technology-empty 
  

Комментарии:

1. Работает отлично. Спасибо! 50 🙂