我正在使用Python pandas数据框df
,其中包含多个列,包括df['FRST_NM']
,df ['LAST_NM'
],df ['BRTH_DT'
]和df [{ {1}}]。
我想查找数据库中'ADDRESS'
和FRST_NM
匹配的行数,但LAST_NM
和BRTH_DT
不匹配。我最终试图计算名字和姓氏匹配但他们各自的出生日期和地址不匹配的可能性。这是一个数据完整性项目。
例如,我想计算ADDRESS
FRST_NM
和John
LAST_NM
所有Doe
和BRTH_DT
字段的实例不匹配。为了清楚起见,我不想输入ADDRESS
和FRST_NM
的值。
我想我正在寻找一个GroupBy子句,它表示GroupBy LAST_NM
,FRST_NM
和不 LAST_NM
和BRTH_DT
,但我我不确定这样的事情是否存在。
答案 0 :(得分:1)
您可以使用
计算唯一BRTH_DT
和ADDRESS
的行数
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%独特的行排出,这是一个完整的(和精彩的)侥幸。如果你尝试其他随机种子,你会发现这种情况经常发生......