Проверьте, все ли значения в столбце dataframe совпадают.

Я хочу быстро и легко проверить, все ли значения столбцов для counts одинаковы в кадре данных:

В:

import pandas as pd

d = {'names': ['Jim', 'Ted', 'Mal', 'Ted'], 'counts': [3, 4, 3, 3]}
pd.DataFrame(data=d)

Из:

  names  counts
0   Jim       3
1   Ted       4
2   Mal       3
3   Ted       3

Я хочу просто простое условие, которое if all counts = same value затем print('True'),

Есть ли быстрый способ сделать это?

6 ответов

Решение

Вы могли бы использовать nunique:

df.counts.nunique() == 1

is_unique

df.counts.is_unique
Out[541]: False

Я предпочитаю:

      df['counts'].eq(df['counts'].iloc[0]).all()

Я считаю, что его легче всего читать, и он работает со всеми типами значений. Я также нашел это достаточно быстро в моем опыте.

Один простой и эффективный способ — проверить, что каждая строка имеет уникальное значение. Это достигается путем измерения длины уникального вывода каждой строки. Предполагаяdfэто pd.DataFrame, это можно сделать так:

      unique = df.apply(lambda row: len(row.unique()) == 1, axis=1)

Я думаю nuniqueвыполняет гораздо больше работы, чем необходимо. Итерация может остановиться на первом отличии. Это простое и универсальное решение используетitertools:

import itertools

def all_equal(iterable):
    "Returns True if all elements are equal to each other"
    g = itertools.groupby(iterable)
    return next(g, True) and not next(g, False)

all_equal(df.counts)

Это можно использовать даже для поиска всех столбцов с постоянным содержимым за один раз:

constant_columns = df.columns[df.apply(all_equal)]

Чуть более читаемая, но менее производительная альтернатива:

df.counts.min() == df.counts.max()

добавлять skipna=False сюда при необходимости.

Метод по умолчанию для scipy.stats.linregress:

      same_val = np.amax(x) == np.amin(x) and len(x) > 1
Другие вопросы по тегам