BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / python / #25708同步于 2021/8/18
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Python机器人发帖

【问题】求助:131万条记录有条件去重的高效方法

c921038977
2021/8/18镜像同步3 回复
需求:对131万条数据去重。 去重规则:同一个号码多条记录,保留有“升降档标志”为1的且操作时间最晚的那一条,如果多条记录的“升降档标志”都不为1,则保留操作时间最晚的一条。 我的解决思路是用for循环,代码如下,运行了一下午还没结束,求助大神,有没有更高效的方法 # 1、对原数据按照操作时间倒排序(data_07表示原数据) data_07_sorted = data_07.sort_values(by=['操作时间'], ascending=False) # 2、建立一个空Dataframe存储筛选后的数据集,并插入第一条排序后的原数据 columns = data_07_sorted.columns.values.tolist() data_07_pure = pd.DataFrame(columns=columns) data_07_pure = data_07_pure.append(data_07_sorted.iloc[0,:]) # 3、按照筛选逻辑进行for循环遍历 data_07_pure = data_07_pure.append(data_07_sorted.iloc[0,:]) for i in range(len(data_07_sorted)): if data_07_sorted.iloc[i,0].tolist() in data_07_pure['号码'].tolist(): tel = data_07_sorted.iloc[i,0].tolist() data_07_pure_tel = data_07_pure[data_07_pure['号码'] == tel] if data_07_pure_tel['升降档标志'].tolist()[0] in [1,]: continue elif data_07_sorted.iloc[i,:]['升降档标志'].tolist() in [1,]: data_07_pure.drop(index=data_07_pure_tel.index, inplace=True) data_07_pure = data_07_pure.append(data_07_sorted.iloc[i,:]) else: data_07_pure = data_07_pure.append(data_07_sorted.iloc[i,:])
订阅后,新回复会通过你的通知中心匿名送达。
3 条回复
newromantics机器人#1 · 2021/8/18
根据描述就两种情况 升降档标志为1或者不为一 可以先预处理一下 用一个flag标识这两种情况 然后可以写MySQL用窗口函数或者按照主键+flag和时间戳覆盖写 感觉100多w放MySQL应该就可 再大一些可以用Doris
paopjian机器人#2 · 2021/8/18
```Python import modin.pandas as pd def get_quchong(x): if len(x) == 1: return x 升降档标志 = x['升降档标志'].to_list() if 1 in 升降档标志: index = 升降档标志.index(1) return x[index:index + 1] else: return x.iloc[0] a = pd.read_excel('data.xlsx', engine='openpyxl') a = a.sort_values(by=['操作时间'], ascending=False) b = a.groupby('号码', as_index=False).apply(get_quchong) c = b.reset_index() c = c[['号码', '升降档标志', '操作时间']] c.to_csv('result.csv') ``` for循环非常耗时间,最好用内置的apply处理 用了modin加速,你可以试试别的多线程加速
c921038977机器人#3 · 2021/8/18
【 在 paopjian 的大作中提到: 】 : [md] : ```Python : import modin.pandas as pd : ................... 哇,好简洁! 谢谢大神!