J'ai un pandas DataFrame où chaque cellule d'une colonne est un tableau 2D d'éléments.

EX: L'observation 1 a la colonne items avec les valeurs ['Baseball', 'Glove','Snack']

Lorsque j'utilise .unique sur les cellules individuelles, chaque cellule est analysée en fonction de la valeur des tableaux entiers, et non des valeurs individuelles du tableau.

Comment puis-je parcourir chaque tableau de chaque cellule pour déterminer la véritable quantité unique d'éléments dans la colonne? Merci

  Items
0 ['Baseball', 'Hockey Stick', 'Mit']
1 ['Mit', 'Tennis Racket']
2 ['Baseball', 'Helmet']

Celles-ci retournent toutes en tant que valeurs uniques, je voudrais obtenir le nombre unique pour chaque valeur dans chaque liste.

0
user2205904 15 mars 2019 à 22:53

2 réponses

Meilleure réponse

J'utiliserais la méthode chain de itertools avec set pour résoudre le problème comme suit.

# you have a dataframe called data with the column items.

from itertools import chain
unique_lists_in_items = data.items.unique().tolist()
set_of_items = set(chain(*unique_lists_in_items))

set_of_items est ce que vous voulez.

0
Samuel Nde 15 mars 2019 à 20:22

Vous pouvez utiliser np.unique et np.concatenate dans la colonne qui vous intéresse. J'ai fait un exemple ci-dessous:

import pandas as pd
import numpy as np

df = pd.DataFrame({'fruits':(np.array(['banana', 'apple']), np.array(['cherry', 'apple']))})
#   items
#0  [banana, apple]
#1  [cherry, apple]
np.concatenate(df.fruits.values) #.values accesses the numpy array representation of the column
#array(['banana', 'apple', 'cherry', 'apple'],
#      dtype='<U6')
np.unique(np.concatenate(df.fruits.values)) #unique items
#array(['apple', 'banana', 'cherry'],
#      dtype='<U6')
np.unique(np.concatenate(df.fruits.values), return_counts=True) #counts
#(array(['apple', 'banana', 'cherry'],
#   dtype='<U6'), array([2, 1, 1]))
subset = df.fruits.dropna() # getting rid of NaNs
subset.loc[subset.map(len)!=0] #get rid of zero-length arrays
#0    [banana, apple]
#1    [cherry, apple]
#Name: fruits, dtype: object
np.unique(np.concatenate(subset.loc[subset.map(len)!=0].values), return_counts=True) #This works as desired
#(array(['apple', 'banana', 'cherry'],
   dtype='<U6'), array([2, 1, 1]))
0
tobsecret 15 mars 2019 à 20:26