Улучшение производительности Pandas и векторизации в больших наборах данныхPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Улучшение производительности Pandas и векторизации в больших наборах данных

Сообщение Anonymous »

КОНТЕКСТ
У меня есть большой набор данных (100–250 МБ) в CSV-файле, и мне нужно распределить группы по совокупности людей. Группировки основаны на динамическом наборе правил, определенном в другом файле CSV. Для простоты воспроизведения я добавил образцы данных и образцы «наборов правил»/строки запросов
ДАННЫЕ

Код: Выделить всё

 # Data looks like this:
ID    Gender    Age     Country
1     Male      60      USA
2     Female    25      UK
3     Male      30      Australia
ТЕКУЩИЙ КОД

Код: Выделить всё

import pandas as pd
import numpy as np

query1 = '(Gender in ["Male","Female"]) & (Country=="USA")'
query2 = '(Country in ["USA", "UK"]) & (Gender=="Male")'
query3 = '(Age > 40) & (Gender=="Male")'

query_list = [query1, query2, query3]
query_names = ['USA', 'MALE_USA_UK', 'MALE_OVER_40']

def assign_name(row, id_list, name, column_list):
id = row['ID']
if name in column_list:
if row[name] == 'Yes':
return 'Yes'
if str(id) in id_list:
return 'Yes'
return 'No'

# Create a dataframe with random data
data = {
'ID': range(1, 101),
'Gender': ['Male', 'Female'] * 50,
'Age': np.random.randint(18, 70, size=100),
'Country': ['USA', 'Canada', 'UK', 'Australia'] * 25
}

df = pd.DataFrame(data)
df = pd.DataFrame(data)
tmp = df.copy()

for query in query_list:
name = query_names[query_list.index(query)]
out = tmp.query(query)

# Create a list of people that were derived in out.  These are 'yes'
person_list = out['ID'].to_list()
column_list = out.columns.to_list()

# Give them a 'Yes' or 'No' based on them being in the 'out' df
df[name] = df.apply(
lambda row: assign_name(row, person_list, name, column_list), axis = 1)
ПРОБЛЕМА
При больших наборах данных с более чем 200 тысячами строк и более чем 50 различными классификационными группами этот процесс занимает много времени. бегать. Я часто получаю ошибку DataFrame — сильно фрагментированная ошибка в .insert. Мне нужна помощь в создании более быстрого и эффективного решения.

Подробнее здесь: https://stackoverflow.com/questions/789 ... ge-dataset
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»