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:
É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)}
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
Oui, la dernière sortie est ce que j'attends –
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? –
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é. –