Поиск наиболее часто встречающегося значения из строк фрейма данных в Pandas

#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. Я обновил свой ответ, чтобы он соответствовал вашей проблеме 🙂