it-swarm.com.de

pandas eindeutige Werte mehrere Spalten

df = pd.DataFrame({'Col1': ['Bob', 'Joe', 'Bill', 'Mary', 'Joe'],
                   'Col2': ['Joe', 'Steve', 'Bob', 'Bob', 'Steve'],
                   'Col3': np.random.random(5)})

Was ist der beste Weg, um die eindeutigen Werte von 'Col1' und 'Col2' zurückzugeben?

Die gewünschte Ausgabe ist 

'Bob', 'Joe', 'Bill', 'Mary', 'Steve'
74
user2333196

pd.unique gibt die eindeutigen Werte eines Eingabearrays oder einer DataFrame-Spalte oder eines Index zurück.

Die Eingabe für diese Funktion muss eindimensional sein, daher müssen mehrere Spalten kombiniert werden. Am einfachsten wählen Sie die gewünschten Spalten aus und zeigen dann die Werte in einem abgeflachten NumPy-Array an. Die ganze Operation sieht so aus:

>>> pd.unique(df[['Col1', 'Col2']].values.ravel('K'))
array(['Bob', 'Joe', 'Bill', 'Mary', 'Steve'], dtype=object)

Beachten Sie, dass ravel() eine Array-Methode ist, die (sofern möglich) eine Ansicht eines mehrdimensionalen Arrays zurückgibt. Das Argument 'K' teilt der Methode mit, das Array in der Reihenfolge zu glätten, in der die Elemente im Speicher abgelegt werden (Pandas speichern normalerweise darunterliegende Arrays in Fortran-zusammenhängender Reihenfolge ; Spalten vor Zeilen). Dies kann erheblich schneller sein als die standardmäßige 'C'-Reihenfolge der Methode.


Alternativ können Sie die Spalten auswählen und an np.unique übergeben:

>>> np.unique(df[['Col1', 'Col2']].values)
array(['Bill', 'Bob', 'Joe', 'Mary', 'Steve'], dtype=object)

ravel() muss hier nicht verwendet werden, da die Methode mehrdimensionale Arrays verarbeitet. Dies ist jedoch wahrscheinlich langsamer als pd.unique, da es einen sortenbasierten Algorithmus anstelle einer Hashtabelle verwendet, um eindeutige Werte zu identifizieren.

Der Geschwindigkeitsunterschied ist für größere DataFrames signifikant (insbesondere, wenn es nur wenige eindeutige Werte gibt):

>>> df1 = pd.concat([df]*100000, ignore_index=True) # DataFrame with 500000 rows
>>> %timeit np.unique(df1[['Col1', 'Col2']].values)
1 loop, best of 3: 1.12 s per loop

>>> %timeit pd.unique(df1[['Col1', 'Col2']].values.ravel('K'))
10 loops, best of 3: 38.9 ms per loop

>>> %timeit pd.unique(df1[['Col1', 'Col2']].values.ravel()) # ravel using C order
10 loops, best of 3: 49.9 ms per loop
123
Alex Riley

Ich habe eine DataFrame mit ein paar einfachen Strings in ihren Spalten eingerichtet:

>>> df
   a  b
0  a  g
1  b  h
2  d  a
3  e  e

Sie können die Spalten, an denen Sie interessiert sind, verketten und die unique-Funktion aufrufen:

>>> pandas.concat([df['a'], df['b']]).unique()
array(['a', 'b', 'd', 'e', 'g', 'h'], dtype=object)
7
Mike
In [5]: set(df.Col1).union(set(df.Col2))
Out[5]: {'Bill', 'Bob', 'Joe', 'Mary', 'Steve'}

Oder:

set(df.Col1) | set(df.Col2)
5
James Little

Bei einer aktualisierten Lösung mit numpy v1.13 + muss die Achse in np.unique angegeben werden, wenn mehrere Spalten verwendet werden. Andernfalls wird das Array implizit abgeflacht.

import numpy as np

np.unique(df[['col1', 'col2']], axis=0)

Diese Änderung wurde im November 2016 eingeführt: https://github.com/numpy/numpy/commit/1f764dbff7c496d6636dc0430f083ada9ff4e4be

1
erikreed

Nicht -pandas Lösung: set () verwenden.

import pandas as pd
import numpy as np

df = pd.DataFrame({'Col1' : ['Bob', 'Joe', 'Bill', 'Mary', 'Joe'],
              'Col2' : ['Joe', 'Steve', 'Bob', 'Bob', 'Steve'],
               'Col3' : np.random.random(5)})

print df

print set(df.Col1.append(df.Col2).values)

Ausgabe:

   Col1   Col2      Col3
0   Bob    Joe  0.201079
1   Joe  Steve  0.703279
2  Bill    Bob  0.722724
3  Mary    Bob  0.093912
4   Joe  Steve  0.766027
set(['Steve', 'Bob', 'Bill', 'Joe', 'Mary'])
1
Jerome Montino

für diejenigen von uns, die alle Dinge Pandas lieben, gelten und natürlich Lambda-Funktionen:

df['Col3'] = df[['Col1', 'Col2']].apply(lambda x: ''.join(x), axis=1)
0
Lisle
np.unique(df.values.flatten())
0
Cohensius

hier ist ein anderer Weg


import numpy as np
set(np.concatenate(df.values))
0
muon
list(set(df[['Col1', 'Col2']].as_matrix().reshape((1,-1)).tolist()[0]))

Die Ausgabe ist ['Mary', 'Joe', 'Steve', 'Bob', 'Bill']

0
smishra