0

正常工作,我有两个数据集 - structured_data(有4000个+记录)和record_data(有400条记录)。我想比较什么都记录存在于record_data与structured_data匹配。多&(和)条件不适合大熊猫据帧

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)]

这条件并不仅仅给出那些对上述每个条件都成立的记录。虽然结果中的许多记录确实符合条件,但不是全部。我确信,以上所采取的属性的数据类型是在这两个数据集是相同的。

我所试图实现的是整合双方的数据集,并最终有一个数据集给所有独特的记录。

想知道如果有什么错误的代码。如果需要,将很乐意分享数据集。谢谢!

回答

1

这是否例子来说明您的问题?更确切地说,最后的输出是你期望的吗?

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 

想知道如果有什么错误的代码。

你明白现在怎么了?


我所试图实现的是整合双方的数据集,并最终有一个数据集给所有独特的记录。

只是为了澄清,你要出现在任一数据集中的所有记录?或者只有两个数据集中的记录?

假设前者。

几个想法:

  1. 鉴于这两个数据集是小,你可以使用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)} 
    
  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 
+0

是,最后的输出是我期待的是什么 –

+0

如果我在strucutured_data中添加(1,6,'e),上面的代码将无法正常工作。基本上它是单独检查条件。我正在寻找的是如果卧室匹配,然后匹配相同记录的浴室,而不是查看整个数据框。说得通? –

+0

感谢Laurie抽出时间在这里澄清我的问题。我明白,条件并不是检查所有属性是否匹配相同的记录,而是正在考虑所有条件对于每个条件是否都是单独的。我试图实现的是将400条记录与数据集中的4000条记录进行匹配,如果它们匹配(基于上述条件/属性),则它们被认为是一条记录,如果它们不匹配,则它是单独的记录。 –