How can I get the most frequent item in a pandas series?
Consider the series s
s = pd.Series(\"1 5 3 3 3 5 2 1 8 10 2 3 3 3
Use value_counts and select first value by index:
val = s.value_counts().index[0]
Or Counter.most_common:
from collections import Counter
val = Counter(s).most_common(1)[0][0]
Or numpy solution:
_, idx, counts = np.unique(s, return_index=True, return_counts=True)
index = idx[np.argmax(counts)]
val = s[index]
pandas.factorize and numpy.bincountThis is very similar to @jezrael's Numpy answer. The difference is the use of factorize and not numpy.unique
factorize returns an integer factorization and unique valuesbincount counts how many of each unique valueargmax identifies which bin or factor is the most fequentargmax to reference the most frequent value from the array of unique valuesi, r = s.factorize()
r[np.bincount(i).argmax()]
3
You can just use pd.Series.mode and extract the first value:
res = s.mode().iloc[0]
This not necessarily inefficient. As always, test with your data to see what suits.
import numpy as np, pandas as pd
from scipy.stats.mstats import mode
from collections import Counter
np.random.seed(0)
s = pd.Series(np.random.randint(0, 100, 100000))
def jez_np(s):
_, idx, counts = np.unique(s, return_index=True, return_counts=True)
index = idx[np.argmax(counts)]
val = s[index]
return val
def pir(s):
i, r = s.factorize()
return r[np.bincount(i).argmax()]
%timeit s.mode().iloc[0] # 1.82 ms
%timeit pir(s) # 2.21 ms
%timeit s.value_counts().index[0] # 2.52 ms
%timeit mode(s).mode[0] # 5.64 ms
%timeit jez_np(s) # 8.26 ms
%timeit Counter(s).most_common(1)[0][0] # 8.27 ms
from scipy import stats
import pandas as pd
x=[1,5,3,3,3,5,2,1,8,10,2,3,3,3]
data=pd.DataFrame({"values":x})
print(stats.mode(data["values"]))
output:-ModeResult(mode=array([3], dtype=int64), count=array([6]))