Pandas: если значение в поле None / null / NaN, добавьте имя поля в новое поле - PullRequest
1 голос
/ 20 марта 2020

Я поставлен в тупик о том, как подойти к конкретной проблеме. По сути, я sh хочу сделать следующее:

Используя pandas, я хочу перебрать строки и, если значение в поле None / NaN, добавить имя поля к новое поле, как показано ниже.

+----+--------+----------+--------+--------+--------+---------------------------------+
| ID | Animal | Building | Letter | Fruit  | Number |           NullFields            |
+----+--------+----------+--------+--------+--------+---------------------------------+
|  1 | Dog    | House    | C      | null   | 4      | Fruit                           |
|  2 | null   | House    | null   | Apple  | null   | Animal, Letter, Number          |
|  3 | Cat    | null     | B      | Orange | null   | Building, Number                |
|  4 | null   | null     | null   | null   | 6      | Animal, Building, Letter, Fruit |
|  5 | Snake  | null     | A      | null   | 7      | Building, Fruit                 |
+----+--------+----------+--------+--------+--------+---------------------------------+

Выше я набрал 'null' для удобства чтения. Я знаю, что None / NaN - это не одно и то же, но данные, с которыми я имею дело, похоже, имеют и то, и другое. Если мне нужно запустить fillna, это нормально.

Я не думаю, что np.where сработает здесь, если я что-то упустил. Я не знаю, нужно ли мне вместо этого использовать iterrows или как.

Любые советы / рекомендации будут высоко оценены!

Ответы [ 2 ]

2 голосов
/ 20 марта 2020

Это будет делать:

# if ID is index, then just `df` instead of `df.iloc[...]
s = df.iloc[:,1:].isna()
df['NullFields'] = (s @ (s.columns + (', '))).str.strip(', ')

Вывод:

   ID Animal Building Letter   Fruit  Number                       NullFields
0   1    Dog    House      C     NaN     4.0                            Fruit
1   2    NaN    House    NaN   Apple     NaN           Animal, Letter, Number
2   3    Cat      NaN      B  Orange     NaN                 Building, Number
3   4    NaN      NaN    NaN     NaN     6.0  Animal, Building, Letter, Fruit
4   5  Snake      NaN      A     NaN     7.0                  Building, Fruit
0 голосов
/ 20 марта 2020

Сначала необходимо сделать истинные NaN поля для измерения, если они равны нулю, тогда мы можем использовать isnull, затем .dot

df['NullableFields'] = df.replace("null", np.nan).isnull().dot(df.columns)

print(df)

    ID   Animal   Building   Letter   Fruit    Number   \
0     1      Dog      House        C     null        4   
1     2     null      House     null    Apple     null   
2     3      Cat       null        B   Orange     null   
3     4     null       null     null     null        6   
4     5    Snake       null        A     null        7   

             NullFields                                 NullableFields  
0                            Fruit                             Fruit    
1           Animal, Letter, Number             Animal  Letter  Number   
2                 Building, Number                   Building  Number   
3  Animal, Building, Letter, Fruit   Animal  Building  Letter  Fruit    
4                  Building, Fruit                   Building  Fruit  
...