Создание словаря из эксель с условием

Есть эксель таблица вида

введите сюда описание изображения

необходимо создать словарь где номер столбца это ключ а номера пустых ячеек это значения При попытке сделать это следующим способом

f = r'R:\TEST\TESTXLS.xlsx'
df = pd.read_excel(f)
for cols in df.columns:
    b.setdefault(cols,[])
    if df.loc[cols]=='nan':
        b[cols].append(df.loc[ID])

print b

появляется ошибка ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all(). Как правильно написать код чтобы избавиться от этой ошибки ?


Ответы (2 шт):

Автор решения: D.Vinogradov

Допустим у нас есть такой фрейм:

df = pd.DataFrame({'a': [np.nan, 2, 3,4 , np.nan], 'b': [6, np.nan, 8, 9, np.nan], 'c':[1, 2, np.nan, 5, 34]})

>>> df

    a    b     c
0  NaN  6.0   1.0
1  2.0  NaN   2.0
2  3.0  8.0   NaN
3  4.0  9.0   5.0
4  NaN  NaN  34.0

В вашем случае это фрейм из эксель файла.

Тогда есть такие варианты.

Вариант 1.

dict_of = {i: df[df[i].isna()].index.to_list() for i in df.columns}

>>> dict_of
{'a': [0, 4], 'b': [1, 4], 'c': [2]}

Вариант 2.

dict_of = {key: [k for k, v in value.items() if np.isnan(v)] for key, value in df[df.isna().any(axis=1)].to_dict().items()})

>>> dict_of

{'a': [0, 4], 'b': [1, 4], 'c': [2]}
→ Ссылка
Автор решения: Grechkin 26

Заработал вот такой вариант

df = df.set_index('ID')
dict_of = {i: df[df[i].isnull()].index.tolist() for i in df.columns}

ввиду работы на старых версиях isna был заменён на isnull, to_list на tolist. Предварительно был установлено новый индекс

→ Ссылка