python - обработка данных в pandas - PullRequest
0 голосов
/ 24 мая 2018

Итак, я вернулся с другим вопросом о питоне и пандах.У меня есть 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 дней, так что ..

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Чтобы выбрать строки, содержащие только значения из Таблицы1, вы можете использовать, например, pd.merge :

col = "FOREIGN_ID"

left = df_table2
right = df_table1[[col]]
filtered = pd.merge(left=left, right=right, on=col, how="inner")

или df.isin () :

ix = df_table2[col].isin(df_table1[col])
filtered = df_table2[ix]

Затем выберите случайную выборку для группы:

def select_random_row(grp):
    choice = np.random.randint(len(grp))
    return grp.iloc[choice]

filtered.groupby(col).apply(select_random_row)
0 голосов
/ 24 мая 2018

Рассматривали ли вы использование pd.merge ()

Ваш вызов будет выглядеть примерно так:

results=pd.merge(table1, table2, how='inner', on='FOREIGN_ID')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...