这是否例子来说明您的问题?更确切地说,最后的输出是你期望的吗?
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
编辑:
下面的基于您的回答,问题是,你单独检查每个列。您获得记录{'bedrooms': 2, 'bathrooms': 6}
,因为structured_data
包含一行bedrooms=2
,并且还包含一行bathrooms=6
。你的条件并不要求它是同一行。
让我们举一个更大的例子。
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
现在让我们来分解record_data[record_data.bathrooms.isin(structured_data.bathrooms) & record_data.bedrooms.isin(structured_data.bedrooms)]
,看看一步一步发生。
In [7]: record_data.bathrooms.isin(structured_data.bathrooms)
Out[7]:
0 True
1 True
2 True
3 False
4 True
Name: bathrooms, dtype: bool
请注意,指数是record_data
。输出没有说任何关于structured_data
哪行匹配。
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
同样,我们没有关于structured_data
行的信息。
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
想知道如果有什么错误的代码。
你明白现在怎么了?
我所试图实现的是整合双方的数据集,并最终有一个数据集给所有独特的记录。
只是为了澄清,你要出现在任一数据集中的所有记录?或者只有两个数据集中的记录?
假设前者。
几个想法:
鉴于这两个数据集是小,你可以使用Python sets
和计算的结合。
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)}
您可以连接您的数据集(假设他们有相同的列),并使用drop_duplicates
获得独特的组合。 Merge, join, and concatenate上的文档有很多例子。
编辑2:
基于新的答案,你可以使用merge()
做一个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
是,最后的输出是我期待的是什么 –
如果我在strucutured_data中添加(1,6,'e),上面的代码将无法正常工作。基本上它是单独检查条件。我正在寻找的是如果卧室匹配,然后匹配相同记录的浴室,而不是查看整个数据框。说得通? –
感谢Laurie抽出时间在这里澄清我的问题。我明白,条件并不是检查所有属性是否匹配相同的记录,而是正在考虑所有条件对于每个条件是否都是单独的。我试图实现的是将400条记录与数据集中的4000条记录进行匹配,如果它们匹配(基于上述条件/属性),则它们被认为是一条记录,如果它们不匹配,则它是单独的记录。 –