0

J'ai deux ensembles de données - les données structurées (ayant 4000 enregistrements +) et les données d'enregistrement (400 enregistrements). J'essaie de comparer tous les enregistrements présents dans record_data qui correspondent à structured_data.Plusieurs conditions & (et) ne fonctionnent pas correctement pour les pandas dataframe

Je le fais en utilisant des attributs communs à la fois l'ensemble de données en utilisant la condition suivante -

filter_df = record_data [record_data.UnitNumber.isin (structured_data.UnitNumber) & record_data.price.isin (structured_data.price) & record_data.zipcode.astype (int) .isin (structured_data.zipcode.astype (int)) & record_data.bedrooms.isin (structured_data.bedrooms) & record_data.bathrooms.isin (structured_data.bathrooms)]

Cette La condition ne donne pas seulement les enregistrements qui sont vrais pour chacune des conditions ci-dessus. Alors que de nombreux enregistrements dans le résultat suivent la condition, mais pas tous. Je me suis assuré que les types de données des attributs pris ci-dessus sont les mêmes dans les deux ensembles de données. Ce que j'essaie de réaliser, c'est d'intégrer à la fois les ensembles de données et éventuellement d'avoir un ensemble de données donnant tous les enregistrements uniques.

Vous vous demandez si quelque chose ne va pas avec le code. Sera heureux de partager l'ensemble de données si nécessaire. Merci!

Répondre

1

Cet exemple illustre-t-il votre problème? Plus précisément, la dernière sortie est ce que vous attendez?

In [1]: import pandas as pd 

In [2]: record_data = pd.DataFrame([[1,2,'a'],[2,6,'b'],[2,2,'c']], columns=['bedrooms', 'bathrooms', 'something_else']) 

In [3]: record_data 
Out[3]: 
    bedrooms bathrooms something_else 
0   1   2    a 
1   2   6    b 
2   2   2    c 

In [4]: structured_data = pd.DataFrame([[1,2,'d'],[2,3,'e'],[1,3,'e']], columns=['bedrooms', 'bathrooms', 'something_else']) 

In [5]: structured_data 
Out[5]: 
    bedrooms bathrooms something_else 
0   1   2    d 
1   2   3    e 
2   1   3    e 

In [6]: record_data[record_data.bedrooms.isin(structured_data.bedrooms) & record_data.bathrooms.isin(structured_data.bathrooms)] 
Out[6]: 
    bedrooms bathrooms something_else 
0   1   2    a 
2   2   2    c 

modifier:

En fonction de vos réponses ci-dessous, le problème est que vous vérifier indépendamment chaque colonne. Vous obtenez l'enregistrement {'bedrooms': 2, 'bathrooms': 6} parce que structured_data contient une ligne avec bedrooms=2 et contient également une ligne avec bathrooms=6. Votre condition ne nécessite pas que ce soit la même rangée.

Prenons un exemple plus grand.

In [1]: import pandas as pd 

In [3]: structured_data = pd.DataFrame([[1,2,'d'],[2,3,'e'],[1,3,'e'],[1,6,'e']], columns=['bedrooms', 'bathrooms', 'something_else']) 

In [4]: structured_data 
Out[4]: 
    bedrooms bathrooms something_else 
0   1   2    d 
1   2   3    e 
2   1   3    e 
3   1   6    e 

In [5]: record_data = pd.DataFrame([[1,2,'a'],[2,6,'b'],[2,2,'c'],[1,8,'g'],[4,2,'h']], columns=['bedrooms', 'bathrooms', 'something_else']) 

In [6]: record_data 
Out[6]: 
    bedrooms bathrooms something_else 
0   1   2    a 
1   2   6    b 
2   2   2    c 
3   1   8    g 
4   4   2    h 

Maintenant, nous allons décomposer et voir record_data[record_data.bathrooms.isin(structured_data.bathrooms) & record_data.bedrooms.isin(structured_data.bedrooms)] ce qui se passe étape par étape. Les indices sont ceux de record_data. La sortie ne dit rien sur les lignes de structured_data qui ont été appariées.

In [8]: record_data.bedrooms.isin(structured_data.bedrooms) 
Out[8]: 
0  True 
1  True 
2  True 
3  True 
4 False 
Name: bedrooms, dtype: bool 

Encore une fois, nous avons aucune information sur structured_data lignes.

In [9]: record_data.bathrooms.isin(structured_data.bathrooms) & record_data.bedrooms.isin(structured_data.bedrooms) 
Out[9]: 
0  True 
1  True 
2  True 
3 False 
4 False 
dtype: bool 

In [10]: record_data[record_data.bathrooms.isin(structured_data.bathrooms) & record_data.bedrooms.isin(structured_data.bedrooms)] 
Out[10]: 
    bedrooms bathrooms something_else 
0   1   2    a 
1   2   6    b 
2   2   2    c 

Vous vous demandez s'il y a quelque chose de mal avec le code.

Comprenez-vous ce qui ne va pas maintenant?


Ce que je suis en train de réaliser est d'intégrer les deux ensembles de données et éventuellement avoir un ensemble de données donnant tous les enregistrements uniques.

Juste pour clarifier, vous voulez tous les enregistrements qui apparaissent dans l'un ou l'autre jeu de données? Ou seulement les enregistrements qui se trouvent dans les deux ensembles de données?

En supposant que le premier.

Quelques idées:

  1. Étant donné que les deux ensembles de données sont de petite taille, vous pouvez utiliser Python sets et calculer l'union.

    In [28]: { tuple(rec) for rec in record_data[['bedrooms', 'bathrooms']].values.tolist() } 
    Out[28]: {(1, 2), (1, 8), (2, 2), (2, 6), (4, 2)} 
    
  2. Vous pouvez concaténer vos ensembles de données (en supposant qu'ils ont les mêmes colonnes) et utiliser drop_duplicates pour obtenir des combinaisons uniques. Le document sur Merge, join, and concatenate a beaucoup d'exemples.


modifier 2:

Sur la base de votre nouvelle réponse, vous pouvez utiliser merge() pour faire l'équivalent d'un SQL inner join:

In [12]: pd.merge(left=record_data, right=structured_data.drop('something_else', axis=1), how='inner', on=['bedrooms', 'bathrooms']) 
Out[12]: 
    bedrooms bathrooms something_else 
0   1   2    a 
+0

Oui, la dernière sortie est ce que j'attends –

+0

Le code ci-dessus ne fonctionnera pas si j'ajoute (1,6, 'e) dans strucutured_data. Fondamentalement, il vérifie la condition individuellement. Ce que je cherche est de savoir si les chambres correspondent, puis assortir les salles de bains du même dossier et ne pas regarder dans l'ensemble des données. Logique? –

+0

Merci Laurie d'avoir pris le temps de clarifier ma question ici. J'ai compris que la condition ne vérifie pas si tous les attributs correspondent au même enregistrement, mais plutôt ce que toutes les conditions valent pour chacune d'entre elles. Ce que j'essayais de faire, c'était de faire correspondre 400 enregistrements avec l'ensemble de données ayant 4000 enregistrements, et s'ils correspondent (en fonction de la condition/attributs ci-dessus), ils sont considérés comme un enregistrement, s'ils ne correspondent pas, c'est un enregistrement séparé. –