У меня есть большой набор данных (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