我有两个数据集- structured_data (有4000多条记录)和record_data (有400条记录)。我试图比较record_data中与structured_data匹配的所有记录。
为此,我使用两个数据集中的一些公共属性,使用以下条件-
record_datarecord_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)
此条件不只是提供对上述每个条件都有效的记录。虽然结果中的许多记录都遵循条件,但并不是全部。我确保上述属性的数据类型在两个数据集中都是相同的。
我试图实现的是集成两个数据集,并最终拥有一个数据集,提供所有唯一的记录。
想知道代码是否有什么问题。如果需要,将乐于共享数据集。谢谢!
发布于 2017-10-16 13:54:31
这个例子说明了你的问题吗?更准确地说,最后的输出是您所期望的吗?
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想知道代码是否有什么问题。
你知道现在出了什么问题吗?
我试图实现的是集成两个数据集,并最终拥有一个数据集,提供所有唯一的记录。
为了澄清,您想要显示在任一数据集中的所有记录吗?还是只有两个数据集中的记录?
假设是前者。
以下是一些想法:
drop_duplicates获得唯一的组合。合并、加入和连接上的文档有很多例子。编辑2:
根据您的新答案,您可以使用merge()执行相当于SQL 内连接的操作。
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 ahttps://stackoverflow.com/questions/46769817
复制相似问题