Итак, я вернулся с другим вопросом о питоне и пандах.У меня есть table1 со следующими столбцами:
ID;COUNT;FOREIGN_ID;OTHER_DATA
1;3;xyz1
2;1;xyz2
3;1;xyz3
table2
ID;FOREIGN_ID;OTHER_DATA
1;xyz1;000001
2;xyz1;000002
3;xyz1;000003
4;xyz1;000004
5;xyz1;000005
6;xyz2;000000
7;xyz2;000000
8;xyz3;000000
9;xyz3;000000
Обе таблицы хранятся в виде файлов CSV.Я загружаю их оба в dataframe, а затем перебираю TABLE1.Я должен найти все записи в таблице 2 с одной и той же записью и случайно выбрать некоторые из них.
df_result = pd.DataFrame()
df_table1 = pd.read_csv(table1, delimiter=';')
df_table2 = pd.read_csv(table2, delimiter=';')
for index, row in df_table1 .iterrows():
df_candidates = df_table2[(df_table2['FOREIGN_ID'] == row['FOREIGN_ID']
random_numbers = np.random.choice(len(df_kandidati), row['count'], replace=False)
df_result.append(df_candidates.iloc[random_numbers])
В моем предыдущем вопросе я получил ответ, что использование цикла For - это большая трата времени ... Но для этой проблемы яне могу найти решение, в котором мне не нужно было бы использовать цикл.
РЕДАКТИРОВАТЬ: я извиняюсь за редактирование моего вопроса так поздно .. был занят другими вещами ... Как указано ниже, result_table,Обратите внимание, что мои реальные таблицы немного отличаются от приведенных ниже.Я реально объединяю таблицы с 3 внешними ключами, но для демонстрации я использую таблицы с поддельными данными.
Итак, логика должна выглядеть примерно так: прочитайте первую строку таблицы1.
1;3;xyz1
Найти все записи с одинаковым FOREIGN_ID в table2 count = 3, foreign_id = xyz1 Строки с foreign_id = xyz1 являются строками:
1;xyz1;000001
2;xyz1;000002
3;xyz1;000003
4;xyz1;000004
5;xyz1;000005
Поскольку count = 3, я должен случайно выбрать 3из этих записей.Я делаю это со следующей строкой: df_candidates - это таблица всех подходящих записей (таблица выше)
random_numbers = np.random.choice(len(df_candidates), row['count'], replace=False)
Затем я сохраняю случайно выбранные записи в df_result после разбора всех строк из таблицы1. Я записываю df_result в csv.
Проблема в том, что мои таблицы имеют размер 0,5 миллиона - 1 миллион строк, поэтому итерации по каждой строке таблицы1 очень медленны ... И я уверен, что есть лучший способ сделать это .. Но язастрял на этом в течение последних 2 дней, так что ..