Pandas计算在某些字段上匹配但在其他字段上不匹配的行数

时间:2016-01-12 02:39:59

标签: python pandas

我正在使用Python pandas数据框df,其中包含多个列,包括df['FRST_NM'],df ['LAST_NM'],df ['BRTH_DT']和df [{ {1}}]。

我想查找数据库中'ADDRESS'FRST_NM匹配的行数,但LAST_NMBRTH_DT不匹配。我最终试图计算名字和姓氏匹配但他们各自的出生日期和地址不匹配的可能性。这是一个数据完整性项目。

例如,我想计算ADDRESS FRST_NMJohn LAST_NM所有DoeBRTH_DT字段的实例不匹配。为了清楚起见,我不想输入ADDRESSFRST_NM的值。

我想我正在寻找一个GroupBy子句,它表示GroupBy LAST_NMFRST_NM LAST_NMBRTH_DT,但我我不确定这样的事情是否存在。

1 个答案:

答案 0 :(得分:1)

您可以使用

计算唯一BRTH_DTADDRESS的行数
df.drop_duplicates().groupby(['FRST_NM','LAST_NM'])['ADDRESS'].count()

(将drop_duplicates应用于整个DataFrame的速度明显快于我的 first answer,它使用自定义函数在每个组上调用drop_duplicates。)例如,

import numpy as np
import pandas as pd
np.random.seed(2016)
N = 50
df = pd.DataFrame({'FRST_NM':np.random.choice(['Charles','Edgar Allan','Agatha'], N),
                   'LAST_NM':np.random.choice(['Dickens', 'Poe', 'Christie'], N),
                   'BRTH_DT':np.random.choice([1812, 1809, 1890], N),
                   'ADDRESS':np.random.choice(['Landport','Boston','Torquay'], N)})

result = pd.DataFrame(
    {'num_unique' : (df.drop_duplicates()
                       .groupby(['FRST_NM','LAST_NM'])['ADDRESS']
                       .count()), 
     'count' : df.groupby(['FRST_NM', 'LAST_NM'])['ADDRESS'].count()})
result['percent'] = result['num_unique'] / result['count']
print(result)

产量

                      count  num_unique   percent
FRST_NM     LAST_NM                              
Agatha      Christie      4           4  1.000000
            Dickens       8           4  0.500000
            Poe           7           5  0.714286
Charles     Christie      7           6  0.857143
            Dickens       4           4  1.000000
            Poe           9           6  0.666667
Edgar Allan Christie      4           3  0.750000
            Dickens       4           3  0.750000
            Poe           3           3  1.000000

请注意,阿加莎克里斯蒂,查尔斯狄更斯和埃德加爱伦坡以100%独特的行排出,这是一个完整的(和精彩的)侥幸。如果你尝试其他随机种子,你会发现这种情况经常发生......