Подтвердить что ты не робот

Поиск количества отдельных элементов в DataFrame в каждом столбце

Я пытаюсь найти счетчик различных значений в каждом столбце, используя Pandas. Это то, что я сделал.

import pandas as pd

df = pd.read_csv('train.csv')
# print(df)

a = pd.unique(df.values.ravel())
print(a)

Он подсчитывает уникальные элементы в DataFrame независимо от строк/столбцов, но мне нужно подсчитывать для каждого столбца выходные данные, отформатированные, как показано ниже.

policyID              0
statecode             0
county                0
eq_site_limit         0
hu_site_limit         454
fl_site_limit         647
fr_site_limit         0
tiv_2011              0
tiv_2012              0
eq_site_deductible    0
hu_site_deductible    0
fl_site_deductible    0
fr_site_deductible    0
point_latitude        0
point_longitude       0
line                  0
construction          0
point_granularity     0

Каким будет наиболее эффективный способ сделать это, так как этот метод будет применяться к файлам размером более 1,5 ГБ?


Исходя из ответов, df.apply(lambda x: len(x.unique())) является самым быстрым.

In[23]: %timeit df.apply(pd.Series.nunique)
1 loops, best of 3: 1.45 s per loop
In[24]: %timeit df.apply(lambda x: len(x.unique()))
1 loops, best of 3: 335 ms per loop
In[25]: %timeit df.T.apply(lambda x: x.nunique(), axis=1)
1 loops, best of 3: 1.45 s per loop
4b9b3361

Ответ 1

Вы можете сделать транспонирование df, а затем с помощью apply вызывать nunique row-wise:

In [205]:
df = pd.DataFrame({'a':[0,1,1,2,3],'b':[1,2,3,4,5],'c':[1,1,1,1,1]})
df

Out[205]:
   a  b  c
0  0  1  1
1  1  2  1
2  1  3  1
3  2  4  1
4  3  5  1

In [206]:
df.T.apply(lambda x: x.nunique(), axis=1)

Out[206]:
a    4
b    5
c    1
dtype: int64

ИЗМЕНИТЬ

Как указано @ajcr, транспонирование не нужно:

In [208]:
df.apply(pd.Series.nunique)

Out[208]:
a    4
b    5
c    1
dtype: int64

Как и в pandas 0,20, мы можем использовать nunique непосредственно на dataframe i.e

df.nunique()
a    4
b    5
c    1
dtype: int64

Ответ 3

В последнее время у меня одинаковые проблемы с подсчетом уникального значения каждого столбца в DataFrame, и я нашел еще одну функцию, которая работает быстрее, чем функция apply:

#Select the way how you want to store the output, could be pd.DataFrame or Dict, I will use Dict to demonstrate:
col_uni_val={}
for i in df.columns:
    col_uni_val[i] = len(df[i].unique())

#Import pprint to display dic nicely:
import pprint
pprint.pprint(col_uni_val)

Это работает для меня почти в два раза быстрее, чем df.apply(lambda x: len(x.unique()))

Ответ 4

Здесь уже есть отличные ответы:), но этого, кажется, не хватает:

   df.apply(lambda x: x.nunique())

И даже лучшие новости, DataFrame.nunique() будет в версии 0.20.0: github этой проблемы