如何根据另一列中的值过滤数据框中的重复列
How do you filter duplicate columns in a dataframe based on a value in another column
当列“代码”= 10 时,我想根据列“NID”、“Lact”和代码过滤 DataFrame 中的重复行。
以下数据为示例数据
data_list = {'NID': {1: '1', 2: '1', 3: '1', 4: '1', 5: '2', 6: '2', 7: '1'},
'Lact': {1: 1, 2: 1, 3: 1, 4: 2, 5: 2, 6: 2, 7: 1},
'Code': {1: 10, 2: 0, 3: 10, 4: 0, 5: 0, 6: 10, 7: 0}}
DataFrame出现在下方
NID Lact Code
1 1 1 10
2 1 1 0
3 1 1 10
4 1 2 0
5 2 2 0
6 2 2 10
7 1 1 0
如果我 运行 以下过滤器识别重复项,它会根据“NID”、“Lact”和“Code”识别重复行
df[(df.duplicated(['NID', 'Lact', 'Code'], keep=False))]
下面提供了输出
NID Lact Code
1 1 1 10
2 1 1 0
3 1 1 10
7 1 1 0
我想使此过滤器以 Code = 10
为条件,因为我想在代码 = 10 时删除重复行的第一个实例,但在代码不等于 10 时不删除
有没有办法为这个过滤器添加 Code == 10
的条件?
IIUC,如果 Code 不等于 10,您想保留所有行,否则删除第一个重复项,对吗?然后你可以将其添加到布尔掩码中:
cols = ['NID', 'Lact', 'Code']
out = df[~df.duplicated(cols, keep=False) | df.duplicated(cols) | df['Code'].ne(10)]
输出:
NID Lact Code
2 1 1 0
3 1 1 10
4 1 2 0
5 2 2 0
6 2 2 10
7 1 1 0
如果条件 Code == 10
使用默认 keep='first'
参数将其与 DataFrame.duplicated
链接,如果需要删除第一个重复的行,并且如果需要还使用 [= 过滤所有重复链 m2
15=] 按位 AND
:
m1 = df['Code'].eq(10)
m2 = df.duplicated(['NID', 'Lact', 'Code'], keep=False)
m3 = df.duplicated(['NID', 'Lact', 'Code'])
df = df[(~m1 | m3) & m2]
print (df)
NID Lact Code
2 1 1 0
3 1 1 10
7 1 1 0
当列“代码”= 10 时,我想根据列“NID”、“Lact”和代码过滤 DataFrame 中的重复行。
以下数据为示例数据
data_list = {'NID': {1: '1', 2: '1', 3: '1', 4: '1', 5: '2', 6: '2', 7: '1'},
'Lact': {1: 1, 2: 1, 3: 1, 4: 2, 5: 2, 6: 2, 7: 1},
'Code': {1: 10, 2: 0, 3: 10, 4: 0, 5: 0, 6: 10, 7: 0}}
DataFrame出现在下方
NID Lact Code
1 1 1 10
2 1 1 0
3 1 1 10
4 1 2 0
5 2 2 0
6 2 2 10
7 1 1 0
如果我 运行 以下过滤器识别重复项,它会根据“NID”、“Lact”和“Code”识别重复行
df[(df.duplicated(['NID', 'Lact', 'Code'], keep=False))]
下面提供了输出
NID Lact Code
1 1 1 10
2 1 1 0
3 1 1 10
7 1 1 0
我想使此过滤器以 Code = 10
为条件,因为我想在代码 = 10 时删除重复行的第一个实例,但在代码不等于 10 时不删除
有没有办法为这个过滤器添加 Code == 10
的条件?
IIUC,如果 Code 不等于 10,您想保留所有行,否则删除第一个重复项,对吗?然后你可以将其添加到布尔掩码中:
cols = ['NID', 'Lact', 'Code']
out = df[~df.duplicated(cols, keep=False) | df.duplicated(cols) | df['Code'].ne(10)]
输出:
NID Lact Code
2 1 1 0
3 1 1 10
4 1 2 0
5 2 2 0
6 2 2 10
7 1 1 0
如果条件 Code == 10
使用默认 keep='first'
参数将其与 DataFrame.duplicated
链接,如果需要删除第一个重复的行,并且如果需要还使用 [= 过滤所有重复链 m2
15=] 按位 AND
:
m1 = df['Code'].eq(10)
m2 = df.duplicated(['NID', 'Lact', 'Code'], keep=False)
m3 = df.duplicated(['NID', 'Lact', 'Code'])
df = df[(~m1 | m3) & m2]
print (df)
NID Lact Code
2 1 1 0
3 1 1 10
7 1 1 0