首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >熊猫数据不能正常工作的多重和(和)条件

熊猫数据不能正常工作的多重和(和)条件
EN

Stack Overflow用户
提问于 2017-10-16 11:59:42
回答 1查看 1.2K关注 0票数 0

我有两个数据集- 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)

此条件不只是提供对上述每个条件都有效的记录。虽然结果中的许多记录都遵循条件,但并不是全部。我确保上述属性的数据类型在两个数据集中都是相同的。

我试图实现的是集成两个数据集,并最终拥有一个数据集,提供所有唯一的记录。

想知道代码是否有什么问题。如果需要,将乐于共享数据集。谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-16 13:54:31

这个例子说明了你的问题吗?更准确地说,最后的输出是您所期望的吗?

代码语言:javascript
复制
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的行。您的条件不要求它是同一行。

让我们举一个更大的例子。

代码语言:javascript
复制
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)]进行分解,看一步一步地发生什么。

代码语言:javascript
复制
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是匹配的。

代码语言:javascript
复制
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行的信息。

代码语言:javascript
复制
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

想知道代码是否有什么问题。

你知道现在出了什么问题吗?

我试图实现的是集成两个数据集,并最终拥有一个数据集,提供所有唯一的记录。

为了澄清,您想要显示在任一数据集中的所有记录吗?还是只有两个数据集中的记录?

假设是前者。

以下是一些想法:

  1. 考虑到这两个数据集都很小,您可以使用Python并计算联合。 在record_data[‘卧室’,‘浴室’].values.tolist()} Out28:{(1,2),(1,8),(2,2),(2,6),(4,2)} }
  2. 您可以连接您的数据集(假设它们具有相同的列),并使用drop_duplicates获得唯一的组合。合并、加入和连接上的文档有很多例子。

编辑2:

根据您的新答案,您可以使用merge()执行相当于SQL 内连接的操作。

代码语言:javascript
复制
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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46769817

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档