首页 > 解决方案 > 使用具有 500k 行数据的 pandas read_sql 时出现内存错误

问题描述

我想做的是:

  1. 如果用户 A 是欺诈者。
  2. 然后将所有与用户 A 共享属性的用户也设置为欺诈者。

桌子:

在此处输入图像描述

表中有 500K 行。

我的代码:

import mysql.connector
from mysql.connector import Error
import pandas as pd
try:
    connection = mysql.connector.connect(host='localhost',
                                         database='database',
                                         user='root',
                                         password='')
    cursor = connection.cursor()
    df_chunk = pd.read_sql("select * from tableuser",con=connection,chunksize=1000000)
    chunk_list = []  
    for chunk in df_chunk:
        chunk_list.append(chunk)       
    df= pd.concat(chunk_list)
    def expand_fraud(no_fraud, fraud, col_name):
        t = pd.merge(no_fraud, fraud, on=col_name)
        if len(t):
            df.loc[df.ID.isin(t.ID_x), "IsFraudsterStatus"] = 1
            return True
        return False
    while True:
        added_fraud = False
        fraud = df[df.IsFraudsterStatus == 1]
        no_fraud = df[df.IsFraudsterStatus == 0]
        added_fraud |= expand_fraud(no_fraud, fraud, "DeviceId")
        added_fraud |= expand_fraud(no_fraud, fraud, "Email")
        added_fraud |= expand_fraud(no_fraud, fraud, "MobileNo")
        if not added_fraud:
            break
    print(df)
except Error as e:
    print("Error reading data from MySQL table", e)
finally:
    if (connection.is_connected()):
        connection.close()
        cursor.close()
        print("MySQL connection is closed")

在此处输入图像描述

上次我在使用 read_sql 时遇到了同样的问题,Chunksize解决了这个问题。如何在 Dataframe 中使用 chunksize?

标签: pythonpandas

解决方案


不知道你为什么要处理块。这是建议的代码:

df['same_device_id'] = 0
fraud_devices = df[df.IsFraudsterStatus == 1]['DeviceId']
for device_id in fraud_devices:
    df[df.device_id == device_id]['same_device_id'] = 1

您为每个额外的公共字段值添加一列。全部完成后,应使用 FraudsterStatus 上的 or 运算符和新字段来确定您的欺诈者。


推荐阅读