it-swarm.com.de

Ermitteln der Anzahl der verschiedenen Elemente in DataFrame in jeder Spalte

Ich versuche, die Anzahl der unterschiedlichen Werte in jeder Spalte mithilfe von Pandas zu ermitteln. Das habe ich getan.

import pandas as pd
import numpy as np

# Generate data.
NROW = 10000
NCOL = 100
df = pd.DataFrame(np.random.randint(1, 100000, (NROW, NCOL)),
                  columns=['col' + x for x in np.arange(NCOL).astype(str)])

Ich muss die Anzahl der verschiedenen Elemente für jede Spalte wie folgt zählen:

col0    9538
col1    9505
col2    9524

Was wäre der effizienteste Weg, dies zu tun, da diese Methode auf Dateien mit einer Größe von mehr als 1,5 GB angewendet wird?


Basierend auf den Antworten ist df.apply(lambda x: len(x.unique())) die schnellste ( notebook ).

%timeit df.apply(lambda x: len(x.unique())) 10 loops, best of 3: 49.5 ms per loop %timeit df.nunique() 10 loops, best of 3: 59.7 ms per loop %timeit df.apply(pd.Series.nunique) 10 loops, best of 3: 60.3 ms per loop %timeit df.T.apply(lambda x: x.nunique(), axis=1) 10 loops, best of 3: 60.5 ms per loop

22
ajknzhol

Ab pandas 0.20 können wir nunique direkt auf DataFrames verwenden, d. H .:

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

Andere ältere Optionen:

Sie könnten eine Transponierung des df vornehmen und dann apply call nunique zeilenweise verwenden:

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

EDIT

Wie von @ajcr ausgeführt, ist die Umsetzung nicht erforderlich:

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

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

Hier schon ein paar tolle Antworten :) aber diese scheint zu fehlen:

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

Ab den Pandas 0.20.0 ist auch DataFrame.nunique() verfügbar.

4

Ein Pandas.Series verfügt über eine .value_counts()-Funktion, die genau das liefert, was Sie möchten. Überprüfen Sie die Dokumentation für die Funktion .

2
CaMaDuPe85

Vor kurzem habe ich dieselben Probleme beim Zählen des eindeutigen Werts jeder Spalte in DataFrame, und ich habe eine andere Funktion gefunden, die schneller als die apply-Funktion ausgeführt wird:

#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)

Das funktioniert für mich fast doppelt so schnell wie df.apply(lambda x: len(x.unique()))

0
Wendao Liu
df.apply(lambda x: len(x.unique()))
0
zehai

Es müssen nur die Spalten mit mehr als 20 eindeutigen Werten für alle Spalten in pandas python getrennt werden:

enter code here
col_with_morethan_20_unique_values_cat=[]
for col in data.columns:
    if data[col].dtype =='O':
        if len(data[col].unique()) >20:

        ....col_with_morethan_20_unique_values_cat.append(data[col].name)
        else:
            continue

print(col_with_morethan_20_unique_values_cat)
print('total number of columns with more than 20 number of unique value is',len(col_with_morethan_20_unique_values_cat))



 # The o/p will be as:
['CONTRACT NO', 'X2','X3',,,,,,,..]
total number of columns with more than 20 number of unique value is 25
0
Ayyasamy