#python #pandas #dataframe
#python #pandas #фрейм данных
Вопрос:
Во фрейме данных я хочу создать еще один столбец, который выводит наиболее частое значение, поступающее из разных столбцов в строке.
A B C D
foo bar baz foo
egg bacon egg egg
bacon egg foo baz
Столбец «E» должен выводить частое значение из строки, например
E
foo
egg
Как я могу это сделать на Python?
Комментарии:
1. Режим с axis = 1?
2. Не понял результат.
Ответ №1:
Воссоздание вашей проблемы с:
df = pd.DataFrame(
{
'A' : ['foo', 'egg', 'bacon'],
'B' : ['bar', 'bacon', 'egg'],
'C' : ['baz', 'egg', 'foo'],
'D' : ['foo', 'egg', 'baz']
}
)
И решение проблемы с
df['E'] = df.mode(axis=1)[0]
Вывод:
A B C D E
0 foo bar baz foo foo
1 egg bacon egg egg egg
2 bacon egg foo baz bacon
Что произойдет, если не будет ни одного наиболее часто встречающегося элемента?
df.mode(axis=1)
0 1 2 3
0 foo NaN NaN NaN
1 egg NaN NaN NaN
2 bacon baz egg foo
Как вы можете видеть, когда есть привязка к тому, чтобы быть наиболее частым, он возвращает значения в наиболее частом наборе. Если я поменяю местами значения foo для egg и baz для bacon в столбцах C и D соответственно, мы получим следующий результат:
0 1
0 foo NaN
1 egg NaN
2 bacon egg
Как вы можете видеть, теперь результирующий набор состоит всего из двух элементов, что означает, что связь находится между беконом и яйцом.
Как мне обнаружить связи?
Давайте поработаем с набором данных, не содержащим столбец D.
df
A B C
0 foo bar baz
1 egg bacon egg
2 bacon egg foo
df_m = df.mode(axis=1)
df_m
0 1 2
0 bar baz foo
1 egg NaN NaN
2 bacon egg foo
df['D'] = df_m[0]
A B C D
0 foo bar baz bar
1 egg bacon egg egg
2 bacon egg foo bacon
Мы можем использовать метод notna(), который предоставляет pandas, для создания маски, чтобы проверить, какие строки не содержат значения NaN, т.е. Какие строки связаны.
Во-первых, мы должны удалить первый столбец, который всегда имеет значение.
df_m = df_m.drop(columns=0)
Затем нам нужно преобразовать фрейм данных, используя другой метод .T, и проверить, нет ли строк, не содержащих NAN.
df_mask = df_m.T.notna().any()
df_mask
0 False
1 False
2 True
dtype: bool
Теперь у нас есть серия логических значений pandas. Мы можем использовать эту маску для перезаписи предыдущего столбца.
df['D'][df_mask] = df['A'][df_mask]
A B C D
0 foo bar baz foo
1 egg bacon egg egg
2 bacon egg foo bacon
Комментарии:
1. Если частое значение не найдено, оно должно возвращать значение из строки первого столбца? В этом случае он возвращает значение, расположенное в алфавитном порядке ниже.
2. Нет, mode работает, возвращая набор значений, т.Е. Если у него есть привязка к наиболее частым, он вернет 2 значения, это можно увидеть в необработанном выводе mode (обновленный пример). Я реализовал это, просто взяв первый элемент, поскольку вы не указали иное.
3. Я использовал эту формулу. И столбец A имеет значение «Foo», столбец B имеет значение «Bar», а значение столбца C равно «Baz». В этом случае приведенная выше формула выведет «Bar», но в этом случае она должна выводить «Foo». Если каждое значение уникально, то выводом должно быть значение из первого столбца.
4. Судя по документации , это не вариант. Для достижения этой цели вам необходимо проверить наличие NA в выходном фрейме данных.
5. Я обновил свой ответ, чтобы он соответствовал вашей проблеме 🙂