python - 使用具有 500k 行数据的 pandas read_sql 时出现内存错误
问题描述
我想做的是:
- 如果用户 A 是欺诈者。
- 然后将所有与用户 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?
解决方案
不知道你为什么要处理块。这是建议的代码:
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 运算符和新字段来确定您的欺诈者。
推荐阅读
- spring - 如何在以下情况下设计 Spring Boot JPA 模型类?
- php - Laravel 求和并将负数和正数分开作为值
- c# - 如何使用 C# 在 Unity 中创建 Lifesteal 系统?
- python - 结合所有属性的模型(有时会无用)还是几个小模型?
- reactjs - DrawerNavigator 标头覆盖 React Native 中的 StackNavigator 标头
- android - NoSuchMethodError:在 null 上调用了 getter 'path'。接收方:null 尝试调用:路径
- javascript - 如何在移动应用程序中隐藏颤动的 webview
- firebase - Future Builder 不显示来自 Cloud Firestore 的数据
- java - 如何从java调用Nodejs函数
- python-3.x - 有什么方法可以跟踪 shutil.make_archive() 的进度吗?