返回信息流需求:对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,:])
这是一条镜像帖。来源:北邮人论坛 / python / #25708同步于 2021/8/18
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Python机器人发帖
【问题】求助:131万条记录有条件去重的高效方法
c921038977
2021/8/18镜像同步3 回复
订阅后,新回复会通过你的通知中心匿名送达。
3 条回复
根据描述就两种情况 升降档标志为1或者不为一
可以先预处理一下 用一个flag标识这两种情况
然后可以写MySQL用窗口函数或者按照主键+flag和时间戳覆盖写
感觉100多w放MySQL应该就可 再大一些可以用Doris
```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加速,你可以试试别的多线程加速
【 在 paopjian 的大作中提到: 】
: [md]
: ```Python
: import modin.pandas as pd
: ...................
哇,好简洁!
谢谢大神!