如何过滤数据框的重复行?

时间:2019-05-01 20:07:29

标签: python-3.x pandas dataframe

我想添加条件以提取数据框中的重复行

DF

KEY    STAT    NUM      ID
ab      L       3       1678
cd      D       4       23221
ab      D       8       1678
cd      L       0       38754

对于重复键,我需要检查ID是否相同,然后保留这两行。 如果ID不同,那么我需要检查NUM,并保留NUM值较大的值,而忽略其他

预期产量

KEY    STAT    NUM      ID
ab      L       3       1678
cd      D       4       23221
ab      D       8       1678
  • 我对范围进行了一些编辑,因为我需要对KEY列进行合并。因此,我计划提取合并表中的两个重复值。 这是我编写的代码,保留@piRSquared答案作为参考,但未获得所需的数据框。
def func(d):
    if d.KEY.nunique()>=1:
        if d.ID.nunique()>=1:
            return d
        else:
            return d.nlargest(1,columns=['NUM'])
    else:
        return d
pd.concat([func(d) for _, d in DF.groupby('KEY')])

3 个答案:

答案 0 :(得分:1)

创建一个函数并将其用于每个组

def f(d):
    if d.ID.nunique() == 1:
        return d.assign(KEY=d.KEY.str.cat(d.STAT, sep='+'))
    else:
        return d.nlargest(1, columns=['NUM'])

pd.concat([f(d) for _, d in df.groupby('KEY')])

    KEY STAT  NUM  ID
0  ab+L    L    3   1
2  ab+D    D    8   1
1    cd    D    4   2

答案 1 :(得分:0)

尝试

# Sort values by NUM
df.sort_values(by='NUM', ascending=False, inplace=True)

# Find which group len > 1
mask = df.groupby(['KEY', 'ID']).ID.transform('count') > 1

df.loc[mask, 'KEY'] = df[mask].KEY + '+' + df[mask].STAT

# Get duplicated KEY index
id_drop = df.loc[~mask].drop_duplicates('KEY', keep='last').index

# Drop the duplicated KEY
df.drop(index=id_drop, inplace=True)

df

    KEY STAT  NUM  ID
2  ab+D    D    8   1
1    cd    D    4   2
0  ab+L    L    3   1

答案 2 :(得分:0)

我找到了一个很好的答案,可以在此处计算数据帧的一列中值的频率:

count the frequency that a value occurs in a dataframe column

基本上要在数据框中提取重复项,请尝试:

# create a count column
df['Count'] = df.groupby('your_col')['your_col'].transform('count')
# Filter out Count = 1
df = df[(df.Count > 1)]