Генерация словаря имен столбцов на основе условия между столбцами фрейма данных

#python #pandas #dataframe #dictionary

#python #pandas #фрейм данных #словарь

Вопрос:

У меня есть следующий фрейм данных :

                         a_11        b_14    c_13     d_12
AC                      True        False   False   False 
BA                      True        False   False   True
AA                      False       False   False   False 
  

Мне нужен словарь с ключом в качестве индекса и значениями в виде списка имен столбцов, которые имеют истинные значения, т. е.

 {
AC : [a_11],
BA : [a_11,d_12],
AA : []
}
  

Как я должен поступить с этой проблемой

редактировать: имена столбцов представляют собой строку, а не символ.

Ответ №1:

Используйте понимание dictioanry, если важна производительность, при транспонировании фрейма данных и преобразовании имен столбцов в список:

 d = {k: v.index[v].tolist() for k, v in df.T.items()}
print (d)
{'AC': ['a_11'], 'BA': ['a_11', 'd_12'], 'AA': []}
  

Еще одна идея с zip преобразованием значений в 2d-массив numpy с помощью DataFrame.to_numpy :

 d = {k: df.columns[v].tolist() for k, v in zip(df.index, df.to_numpy())}
print (d)
{'AC': ['a_11'], 'BA': ['a_11', 'd_12'], 'AA': []}
  

Ответ №2:

Вы можете использовать df.mul здесь для умножения df df.columns , а затем использовать df.agg для фильтрации пустых строк ''

 out = df.mul(df.columns).agg(lambda x:[*filter(None, x)], axis=1)

AC          [a_11]
BA    [a_11, d_12]
AA              []
dtype: object
  

Здесь вы можете использовать понимание списка.

 vals = [df.columns[m].tolist() for m in df.values]
# vals -> [['a_11'], ['a_11', 'd_12'], []]
pd.Series(vals, index=df.index)

AC          [a_11]
BA    [a_11, d_12]
AA              []
dtype: object