Как получить все столбцы соответсвующие заданому значению?
Есть такая таблица:
dataframe = pd.DataFrame([(0,1,1,1), (0,0,1,0), (1,1,0,0)], columns=['a','b','c','d'])
Нужно создать еще один столбец (например f), в котором будут перечислены столбцы, в которых оказалось значение True.
Что должно получиться:
b,c,d
c
a,b
dataframe.columns[dataframe.iloc[0] == 1]
Так можно вывести то, что нужно но для одного элемента.
Как это сделать без цикла для всего фрейма и красиво?
Ответы (3 шт):
Автор решения: Alpensin
→ Ссылка
Я думаю, что это не очень хороший способ хранения информации. А для вывода результатов не нужно это сохранять в dataframe. Но вот как-то так у меня получилось:
import pandas as pd
df = pd.DataFrame([(0,1,1,1), (0,0,1,0), (1,1,0,0)], columns=['a', 'b', 'c', 'd'])
df['f'] = [','.join(list(i[1][i[1] == 1].index)) for i in df.iterrows()]
Тут итерация по датафрейму, что не очень хорошо. Но как её избежать не придумал.
Автор решения: MaxU
→ Ссылка
Один из векторизированных вариантов:
df["f"] = (pd
.DataFrame(
[df.columns.to_list()] * len(df),
index=df.index,
columns=df.columns)
[df.eq(1)]
.fillna("")
.T
.apply(",".join)
.str.strip(","))
Результат:
In [170]: df
Out[170]:
a b c d f
0 0 1 1 1 b,c,d
1 0 0 1 0 c
2 1 1 0 0 a,b
Автор решения: SergFSM
→ Ссылка
вот так получилось без цикла и итерации:
df = pd.DataFrame([(0,1,1,1), (0,0,1,0), (1,1,0,0)], columns=['a','b','c','d'])
df['f'] = df.apply(lambda x: pd.Series(x[x==1]).index.to_list(), axis=1)
B [171]: df
Out[171]:
a b c d f
0 0 1 1 1 [b, c, d]
1 0 0 1 0 [c]
2 1 1 0 0 [a, b]
