数据表 去重



-- 查找表中多余的重复记录(多个字段)

SELECT * FROM tb_news1 a
WHERE (a.Id,a.TITLE,a.SOURCE,a.DATE) IN
(SELECT a.Id,a.TITLE,a.SOURCE,a.DATE FROM tb_news1 a GROUP BY a.Id,a.TITLE,a.SOURCE,a.DATE HAVING COUNT(1) > 1)


-- 删除表中多余的重复记录(多个字段),只留有id最小的记录
DELETE FROM tb_news1 a WHERE
(a.Id,a.TITLE,a.SOURCE,a.DATE) IN
(SELECT a.Id,a.TITLE,a.SOURCE,a.DATE FROM tb_news1 a GROUP BY a.Id,a.TITLE,a.SOURCE,a.DATE HAVING COUNT(1) > 1)

AND a.Id NOT IN (SELECT MIN(a.Id) FROM tb_news1 a GROUP BY a.Id,a.TITLE,a.SOURCE,a.DATE HAVING COUNT(1)>1 )



-- ================ test data ======================
DROP TABLE IF EXISTS tb_news1;
CREATE TABLE tb_news1 (
Id INT(11) NOT NULL ,
TITLE VARCHAR(255) DEFAULT NULL COMMENT '标题',
CONTENT VARCHAR(1000) DEFAULT NULL COMMENT '内容',
SOURCE VARCHAR(255) DEFAULT NULL COMMENT '新闻来源',
DATE DATETIME DEFAULT NULL COMMENT '新闻日期'
-- ,
-- PRIMARY KEY (Id)
) ENGINE=INNODB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

INSERT INTO tb_news1 VALUES (1,'谷歌发布Android 4.0.3内核源代码','Google','iteye','2011-12-20');
INSERT INTO tb_news VALUES (2,'谷歌发布Android 4.0.3内核源代码','Google','iteye','2011-12-20');
INSERT INTO tb_news VALUES (3,'Ubuntu 将从用户电脑移除 JDK','Ubuntu ','baidu','2011-12-20');
INSERT INTO tb_news VALUES (4,'谷歌发布Android 4.0.3内核源代码','Google','iteye','2011-12-20');
INSERT INTO tb_news VALUES (5,'Ubuntu 将从用户电脑移除 JDK','Ubuntu ','baidu','2011-12-20');
INSERT INTO tb_news1 VALUES (6,'Ubuntu 将从用户电脑移除 JDK','Ubuntu ','baidu','2011-12-20');
--
INSERT INTO tb_news1 VALUES (1,'谷歌发布Android 4.0.3内核源代码','Google','iteye','2011-12-20');
INSERT INTO tb_news1 VALUES (6,'Ubuntu 将从用户电脑移除 JDK','Ubuntu ','baidu','2011-12-20');


SELECT * FROM tb_news1;

-- =================================


-- ---
1。用rowid方法
据据oracle带的rowid属性,进行判断,是否存在重复,语句如下:

查数据:
SELECT * FROM table1 a WHERE rowid !=(SELECT MAX(rowid)
FROM table1 b WHERE a.name1=b.name1 AND a.name2=b.name2……)

删数据:
DELETE FROM table1 a WHERE rowid !=(SELECT MAX(rowid)
FROM table1 b WHERE a.name1=b.name1 AND a.name2=b.name2……)

2.group BY方法

查数据:
SELECT COUNT(num), MAX(NAME) FROM student --列出重复的记录数,并列出他的NAME属性
GROUP BY num
HAVING COUNT(num) >1 --按num分组后找出表中num列重复,即出现次数大于一次
删数据:
DELETE FROM student
GROUP BY num
HAVING COUNT(num) >1
这样的话就把所有重复的都删除了。



### Pandas中使用`drop_duplicates()`方法进行数据 在Python的Pandas库中,`drop_duplicates()`方法是一个非常强大的工具,用于从DataFrame或Series中删除复行。此方法可以基于所有列或指定列进行操作,并且可以选择保留首次出现、最后一次出现或者不保留任何复项。 以下是一些常见的用法和代码示例: #### 示例1:删除整个DataFrame中的复行 ```python import pandas as pd # 创建一个包含复值的 DataFrame data = {'Name': ['Alice', 'Bob', 'Alice', 'Eve'], 'Age': [25, 30, 25, 22], 'Score': [85, 90, 85, 88]} df = pd.DataFrame(data) # 对整个 DataFrame 进行 df_cleaned = df.drop_duplicates() print(df_cleaned) ``` 上述代码会删除完全相同的行,仅保留第一次出现的记录[^2]。 #### 示例2:基于某些列进行 如果只想根据特定列来判断是否复,可以通过`subset`参数指定这些列: ```python # 基于 'Name' 列进行 df_cleaned_subset = df.drop_duplicates(subset=['Name']) print(df_cleaned_subset) ``` 这样只会根据`Name`列的值来判断是否为复行,并保留第一次出现的记录[^2]。 #### 示例3:删除所有复项而不保留任何记录 有时需要完全移除所有复的记录,而不是保留其中一个。可以通过设置`keep=False`实现: ```python # 删除所有复项 data = pd.DataFrame({ 'a':[2,1,1,1,1,1,2], 'b':[1,3,2,4,1,1,5], 'c':[1,3,2,4,1,1,3], 'd':[1,3,2,4,1,1,8] }) data_del = data.drop_duplicates(keep=False) print(data_del) ``` 这里会将所有复的行都删除,不会保留任何复记录[^1]。 #### 示例4:提取复项 如果目标是从数据集中提取出所有复的行,可以通过两次调用`drop_duplicates()`来实现: ```python # 第一步: ,将非数据丢弃 data1 = data.drop_duplicates(subset='a', keep=False, inplace=False) # 第二步: ,保留一组数据 data2 = data.drop_duplicates(subset='a', keep='first', inplace=False) # 第三步: 合并并再次 result = data1.append(data2).drop_duplicates(subset='a', keep=False, inplace=False) print(result) ``` 这段代码首先移除了所有非复项,然后保留了一组数据,最后通过合并和再次得到了所有复的记录[^4]。 #### 注意事项 当处理包含列表或其他复杂数据类型的列时,`drop_duplicates()`可能无法直接应用。此时需要先将列表转换为字符串形式再进行操作[^3]。 ```python import pandas as pd # 创建一个包含列表的 DataFrame df = pd.DataFrame({'A': [1, 2, 3, 4], 'B': [[1, 2], [1, 3], [2, 3], [1, 2]]}) # 将列表转换为字符串 df['B'] = df['B'].apply(lambda x: ','.join(map(str, x))) # 使用 drop_duplicates() 方法 df = df.drop_duplicates('B') print(df) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值