如果两列中的连续值相同,如何在python中删除重复项?
我有一个如下所示的数据帧:如果两列中的连续值相同,如何在python中删除重复项?,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个如下所示的数据帧: A B C 1 8 23 2 8 22 3 9 45 4 9 45 5 6 12 6 4 10 7 11 12 我想删除重复项,如果C也是相同的,则保留连续出现的第一个值。 例如,此处出现的“9”是重复的B列,它们在“C”列中的对应出现也是重复的“45”。在这种情况下,我希望保留第一次出现 预期产出: A B C 1 8 23 2 8 22 3 9 45 5 6 1
A B C
1 8 23
2 8 22
3 9 45
4 9 45
5 6 12
6 4 10
7 11 12
我想删除重复项,如果C也是相同的,则保留连续出现的第一个值。
例如,此处出现的“9”是重复的B列,它们在“C”列中的对应出现也是重复的“45”。在这种情况下,我希望保留第一次出现
预期产出:
A B C
1 8 23
2 8 22
3 9 45
5 6 12
6 4 10
7 11 12
我试过一些分组,但不知道如何放弃
代码:
此group by返回一个系列,但我想删除。添加2列:
df['consecutive'] = (df['B'] != df['B'].shift(1)).cumsum()
df = df.drop_duplicates(['consecutive','C'])
print (df)
A B C consecutive
0 1 8 23 1
1 2 8 22 1
2 3 9 45 2
4 5 6 12 3
5 6 4 10 4
6 7 11 12 5
或使用|
按位或
链接这两个条件:
df = df[(df['B'] != df['B'].shift()) | (df['C'] != df['C'].shift())]
print (df)
A B C
0 1 8 23
1 2 8 22
2 3 9 45
4 5 6 12
5 6 4 10
6 7 11 12
添加两列:
df['consecutive'] = (df['B'] != df['B'].shift(1)).cumsum()
df = df.drop_duplicates(['consecutive','C'])
print (df)
A B C consecutive
0 1 8 23 1
1 2 8 22 1
2 3 9 45 2
4 5 6 12 3
5 6 4 10 4
6 7 11 12 5
或使用|
按位或
链接这两个条件:
df = df[(df['B'] != df['B'].shift()) | (df['C'] != df['C'].shift())]
print (df)
A B C
0 1 8 23
1 2 8 22
2 3 9 45
4 5 6 12
5 6 4 10
6 7 11 12
用于过滤此类记录的oneliner是:
df[(df[['B', 'C']].shift() != df[['B', 'C']]).any(axis=1)]
因此,我们在此检查列['B','C']
是否与移位的行相同,如果不相同,则保留以下值:
>>> df[(df[['B', 'C']].shift() != df[['B', 'C']]).any(axis=1)]
A B C
0 1 8 23
1 2 8 22
2 3 9 45
4 5 6 12
5 6 4 10
6 7 11 12
这是非常可扩展的,因为我们可以定义一个函数,该函数可以轻松地对任意数量的值进行操作:
def drop_consecutive_duplicates(df, *colnames):
dff = df[list(colnames)]
return df[(dff.shift() != dff).any(axis=1)]
因此,您可以使用以下方法进行过滤:
drop_consecutive_duplicates(df, 'B', 'C')
用于过滤此类记录的oneliner是:
df[(df[['B', 'C']].shift() != df[['B', 'C']]).any(axis=1)]
因此,我们在此检查列['B','C']
是否与移位的行相同,如果不相同,则保留以下值:
>>> df[(df[['B', 'C']].shift() != df[['B', 'C']]).any(axis=1)]
A B C
0 1 8 23
1 2 8 22
2 3 9 45
4 5 6 12
5 6 4 10
6 7 11 12
这是非常可扩展的,因为我们可以定义一个函数,该函数可以轻松地对任意数量的值进行操作:
def drop_consecutive_duplicates(df, *colnames):
dff = df[list(colnames)]
return df[(dff.shift() != dff).any(axis=1)]
因此,您可以使用以下方法进行过滤:
drop_consecutive_duplicates(df, 'B', 'C')
您可以计算一系列要删除的行,然后删除它们:
to_drop = (df['B'] == df['B'].shift())&(df['C']==df['C'].shift())
df = df[~to_drop]
正如预期的那样:
A B C
0 1 8 23
1 2 8 22
2 3 9 45
4 5 6 12
5 6 4 10
6 7 11 12
您可以计算一系列要删除的行,然后删除它们:
to_drop = (df['B'] == df['B'].shift())&(df['C']==df['C'].shift())
df = df[~to_drop]
正如预期的那样:
A B C
0 1 8 23
1 2 8 22
2 3 9 45
4 5 6 12
5 6 4 10
6 7 11 12
检查B行和C行之间差异的简单方法是,如果差异为0(重复值),则删除值,代码为
df[ ~((df.B.diff()==0) & (df.C.diff()==0)) ]
检查B行和C行之间差异的简单方法是,如果差异为0(重复值),则删除值,代码为
df[ ~((df.B.diff()==0) & (df.C.diff()==0)) ]
代码
df1 = df.drop_duplicates(subset=['B', 'C'])
结果
A B C
0 1 8 23
1 2 8 22
2 3 9 45
4 5 6 12
5 6 4 10
6 7 11 12
A B C
0 1 8 23
1 2 8 22
2 3 9 45
4 5 6 12
5 6 4 10
6 7 11 12
代码
df1 = df.drop_duplicates(subset=['B', 'C'])
结果
A B C
0 1 8 23
1 2 8 22
2 3 9 45
4 5 6 12
5 6 4 10
6 7 11 12
A B C
0 1 8 23
1 2 8 22
2 3 9 45
4 5 6 12
5 6 4 10
6 7 11 12
如果我正确理解您的问题,考虑到以下数据框架:
df = pd.DataFrame({'B': [8, 8, 9, 9, 6, 4, 11], 'C': [22, 23, 45, 45, 12, 10, 12],})
此单行代码使用以下方法解决了您的问题:
它给出了预期的结果:
B C
0 8 22
1 8 23
2 9 45
4 6 12
5 4 10
6 11 12
如果我正确理解您的问题,考虑到以下数据框架:
df = pd.DataFrame({'B': [8, 8, 9, 9, 6, 4, 11], 'C': [22, 23, 45, 45, 12, 10, 12],})
此单行代码使用以下方法解决了您的问题:
它给出了预期的结果:
B C
0 8 22
1 8 23
2 9 45
4 6 12
5 4 10
6 11 12
使用,并在轴=1上:
注意:此方法仅适用于数字列
输出
A B C
0 1 8 23
1 2 8 22
2 3 9 45
4 5 6 12
5 6 4 10
6 7 11 12
A B C
0 1 8 23
1 2 8 22
2 3 9 45
4 5 6 12
5 6 4 10
6 7 11 12
详细信息
df[['B', 'C']].diff()
B C
0 NaN NaN
1 0.0 -1.0
2 1.0 23.0
3 0.0 0.0
4 -3.0 -33.0
5 -2.0 -2.0
6 7.0 2.0
然后,我们检查一行中的任何值是否与0
不相等(ne
):
df[['B', 'C']].diff().ne(0).any(axis=1)
0 True
1 True
2 True
3 False
4 True
5 True
6 True
dtype: bool
使用,并在轴=1上:
注意:此方法仅适用于数字列
输出
A B C
0 1 8 23
1 2 8 22
2 3 9 45
4 5 6 12
5 6 4 10
6 7 11 12
A B C
0 1 8 23
1 2 8 22
2 3 9 45
4 5 6 12
5 6 4 10
6 7 11 12
详细信息
df[['B', 'C']].diff()
B C
0 NaN NaN
1 0.0 -1.0
2 1.0 23.0
3 0.0 0.0
4 -3.0 -33.0
5 -2.0 -2.0
6 7.0 2.0
然后,我们检查一行中的任何值是否与0
不相等(ne
):
df[['B', 'C']].diff().ne(0).any(axis=1)
0 True
1 True
2 True
3 False
4 True
5 True
6 True
dtype: bool
只有连续的?或在整个数据帧上重复?仅连续?仅连续?或在整个数据帧上重复?仅连续