Проверьте, все ли значения в столбце 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 ответов
Я предпочитаю:
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