2017-05-25 2 views
0

je un dataframe qui contient divers produits et leur description comme le montre l'image ci-dessous:Comment un sous-ensemble dataframe de pandas géants basé sur un dictionnaire en utilisant la casse correspondant

enter image description here

J'ai un dict qui contient les paires clé-valeur sur la base duquel le filtrage doit être effectué:

ent_dict

{'brand': 'Dexter', 'color': 'brown', 'product': 'footwear', 'size': '32'} 

Comme on peut s een le dict et dataframe peuvent contenir des valeurs dans différents cas et par conséquent je dois faire une correspondance insensible à la casse ici. En outre, il peut y avoir des colonnes qui sont numériques pour lesquelles la correspondance normale fera l'affaire. Donc, quelqu'un peut m'aider s'il vous plaît dans ce domaine.

Répondre

0

Ce qui précède fonctionne pour les chaînes de caractères. Vous pouvez également modifier l'instruction finale pour qu'elle corresponde également aux entiers.

import numpy as np 
import pandas as pd 
import re 

df = pd.DataFrame({'Product': np.array(['Footwear' for i in range(4)]), 'Category': np.array(['Women' for i in range(4)]), 'Size': np.array([7, 7, 7, 8]), 'Color': np.array(['black', 'brown', 'blue', 'black'])}) 

ent_dict = {'Category': 'Women', 'Color': 'black', 'Product': 'Footwear'} 
values = [i for i in ent_dict.values()] 
columns = [df.filter(regex=re.compile(i, re.IGNORECASE)).columns[0] for i in ent_dict] 

df[eval(" & ".join(["(df['{0}'] == {1})".format(col, repr(cond)) 
      for col, cond in zip(columns, values)]))] 

Le cas de recherche insensible peut être accompli en utilisant str.contains d'objet DataFrame.

df[eval(" & ".join(["(df['{0}'].str.contains({1}, case=False))".format(col, repr(cond)) 
      for col, cond in zip(columns, values)]))] 
+0

Merci pour la réponse rapide, mais le problème est que dans mon df, la valeur de la couleur pourrait être "noir" mais dans le ent_dict il est «noir». Cela ne fonctionne pas dans ce cas. –

+0

mis à jour les ans – praba230890

+0

merci beaucoup @ praba230890 pour l'aide.Une dernière chose, si je mets la taille aussi dans la partie de vérification, je reçois un typeerror. Je ne suis pas sûr de savoir comment faire une chaîne de correspondance avec des entiers dans python 3+ comme dans Python 2.7 c'était autorisé. –