pandas重复记录查找相同和不同的列

时间:2017-05-23 18:13:26

标签: python pandas duplicates

我有像

这样的记录
raw_data = {
        'subject_id': ['1', '2', '2', '3', '3'],
        'name': ['A', 'B', 'B', 'C', 'D'],
        'age_group' : [1, 2, 2, 1, 1]}
df = pd.DataFrame(raw_data, columns = ['subject_id', 'name','age_group'])

包含(重复的)ID和一些其他列。以下

ids = df.subject_id
df[ids.isin(ids[ids.duplicated()])]

将仅返回重复的记录。现在我想更好地理解

  • 相同
  • 不同

对于每个重复的记录,即在这种情况下,我希望收到有问题的重复ID和行不同的相应列。

  subject_id name
1          2    B
2          2    B
3          3    C
4          3    D

2 个答案:

答案 0 :(得分:3)

如果你有

>>>duplicated_ids
  subject_id name  age_group
1          2    B          2
2          2    B          2
3          3    C          1
4          3    D          1

然后

>>>othercols = duplicated_ids.columns[1:]
>>>outcols = ['subject_id']
>>>for col in othercols:
       if not duplicated_ids.drop_duplicates(['subject_id', col], keep=False).empty:
           outcols.append(col)

>>>duplicated_ids.loc[:, outcols]
  subject_id name
1          2    B
2          2    B
3          3    C
4          3    D

答案 1 :(得分:1)

这是一种方法,可以探索并更好地了解差异发生的位置。

我们会设置一个列,表明我们找到了一行,其中给定subject_id与我们之前为其name或其age_group记录的内容不匹配,即我们我发现了一个区别。此列将被称为diff_indicator,如果与先前记录的值没有差异,则为二进制0,如果不同,则为1

storage_dict = {}


for i in range(len(df)):
    if not df.loc[i, 'subject_id'] in storage_dict:
        storage_dict[df.loc[i, 'subject_id']] = (df.loc[i, 'name'], df.loc[i, 'age_group'])
for i in range(len(df)):
    if (df.loc[i, 'name'] != storage_dict[df.loc[i, 'subject_id']][0]) | \
    (df.loc[i, 'age_group'] != storage_dict[df.loc[i, 'subject_id']][1]):
        df.loc[i, 'diff_indicator'] = 1
    else:
        df.loc[i, 'diff_indicator'] = 0

从这里我们可以探索存在差异的地方。

>>> df.loc[df['diff_indicator'] == 1]['subject_id'].unique()
array(['2', '3'], dtype=object)

>>> df.loc[df['diff_indicator'] == 1]
  subject_id name  age_group  diff_indicator
2          2    B          1             1.0
4          3    D          1             1.0

根据您的兴趣,有很多方法可以查询。我们可以像这样返回所需的输出......

>>> df.loc[df['subject_id'].isin(df.loc[df['diff_indicator'] == 1]['subject_id'].unique())]
  subject_id name  age_group  diff_indicator
1          2    B          2             0.0
2          2    B          1             1.0
3          3    C          3             0.0
4          3    D          1             1.0

我们可以看到此数据框的前两列是所需的输出。