我有像
这样的记录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
答案 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
我们可以看到此数据框的前两列是所需的输出。