Есть ли более быстрый (непонятный?) Способ объединить столбцы pandas df int в строку с разделением точками без TypeError

Просто используйте класс BlueM / tree php для создания дерева таблицы самосогласования в mysql.

Tree и Tree\node - это классы PHP для обработки данных который структурирован иерархически с использованием ссылок на родительские идентификаторы. Типичным примером является таблица в реляционной базе данных, где «родительское» поле каждой записи ссылается на первичный ключ другой записи. Конечно, Tree может не только использовать данные, происходящие из базы данных, но и все: вы предоставляете данные, а Tree использует их независимо от того, откуда поступают данные и как они были обработаны. подробнее

Вот пример использования BlueM / tree:

query('SELECT id, parent, title FROM tablename ORDER BY title'); 
$records = $stm->fetchAll(PDO::FETCH_ASSOC); 
$tree = new BlueM\Tree($records); 
...

2
задан Karl Baker 3 March 2019 в 08:06
поделиться

3 ответа

Для сравнения данных методов с другими доступными методами обратитесь к ответу @Jezrael.

Метод 1

Чтобы добавить фиктивный столбец, содержащий ., используйте его при обработке, а затем отбросьте его:

%%timeit
df3['dummy'] ='.'
res = df3['job_number'].values.astype(str) + df3['dummy'] + df3['task_number'].values.astype(str)
df3.drop(columns=['dummy'], inplace=True)

1.31 ms ± 41.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

В расширение метода 1, если исключить время обработки создания фиктивного столбца и его отбрасывания, тогда это лучшее, что вы получите -

%%timeit
df3['job_number'].values.astype(str) + df3['dummy'] + df3['task_number'].values.astype(str)

286 µs ± 15.9 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
<час>

Метод 2

Использование apply

%timeit df3.T.apply(lambda x: str(x[0]) + '.' + str(x[1]))

883 µs ± 22 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
0
ответ дан meW 3 March 2019 в 08:06
поделиться

Методы в порядке %%timeit результатов

Я рассчитал все предложенные методы и еще несколько на двух фреймах данных. Вот временные результаты для предложенных методов (спасибо @meW и @jezrael). Если я пропустил или у вас есть другой, дайте мне знать, и я добавлю это.

Для каждого метода показаны два момента времени: сначала для обработки 3 строк в примере df, а затем для обработки 57K строк в другом df. Время может варьироваться в другой системе. Решения, включающие TEST['dot'] в строку конкатенации, требуют этого столбца в df: добавьте его с помощью TEST['dot'] = '.'.

Оригинальный метод (по-прежнему самый быстрый):

.astype (str), +, '.'

%%timeit
TEST['filename'] = TEST['job_number'].astype(str) + '.' + TEST['task_number'].astype(str)
# 553 µs ± 6.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each) on 3 rows
# 69.6 ms ± 876 µs per loop (mean ± std. dev. of 7 runs, 10 loops each) on 57K rows

Предлагаемые методы и несколько перестановок на их:

.astype (int) .astype (str), +, '.'

%%timeit
TEST['filename'] = TEST['job_number'].astype(int).astype(str) + '.' + TEST['task_number'].astype(int).astype(str)
# 553 µs ± 6.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each) on 3 rows
# 70.2 ms ± 739 µs per loop (mean ± std. dev. of 7 runs, 10 loops each) on 57K rows

.values.astype (int). astype (str), +, TEST ['dot']

%%timeit
TEST['filename'] = TEST['job_number'].values.astype(int).astype(str) + TEST['dot'] + TEST['task_number'].values.astype(int).astype(str)
# 221 µs ± 5.93 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each) on 3 rows
# 82.3 ms ± 743 µs per loop (mean ± std. dev. of 7 runs, 10 loops each) on 57K rows

.values.astype (str), +, TEST ['dot']

%%timeit
TEST["filename"] = TEST['job_number'].values.astype(str) + TEST['dot'] + TEST['task_number'].values.astype(str)
# 221 µs ± 5.93 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each) on 3 rows
# 92.8 ms ± 1.21 ms per loop (mean ± std. dev. of 7 runs, 10 loops each) on 57K rows

'.'. Join (), понимание списка, .values.astype (str)

%%timeit
TEST["filename"] = ['.'.join(i) for i in TEST[["job_number",'task_number']].values.astype(str)]
# 743 µs ± 19.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each) on 3 rows
# 147 ms ± 532 µs per loop (mean ± std. dev. of 7 runs, 10 loops each) on 57K rows

f-string, понимание списка,. values.astype (str)

%%timeit
TEST["filename2"] = [f'{i}.{j}' for i,j in TEST[["job_number",'task_number']].values.astype(str)]
# 642 µs ± 27.9 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each) on 3 rows
# 167 ms ± 3.3 ms per loop (mean ± std. dev. of 7 runs, 1 loop each) on 57K rows

'.'. join (), zip, понимание списка, .map (str)

%%timeit
TEST["filename"] = ['.'.join(i) for i in 
                          zip(TEST["job_number"].map(str), TEST["task_number"].map(str))]
# 512 µs ± 5.74 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each) on 3 rows
# 181 ms ± 4.17 ms per loop (mean ± std. dev. of 7 runs, 1 loop each) on 57K rows
[1123 ] apply (lambda, str (x [2]), +, '.')

%%timeit
TEST['filename'] = TEST.T.apply(lambda x: str(x[2]) + '.' + str(x[10]))
# 735 µs ± 13.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each) on 3 rows
# 2.69 s ± 18.9 ms per loop (mean ± std. dev. of 7 runs, 1 loop each) on 57K rows

Если вы видите способ улучшить что-либо из этого, пожалуйста, дайте мне знать и я добавлю в список!

0
ответ дан Karl Baker 3 March 2019 в 08:06
поделиться

Вы можете использовать понимание списка:

df3["filename"] = ['.'.join(i) for i in 
                          zip(df3["job_number"].map(str),df3["task_number"].map(str))]

Если использовать python 3.6+, самое быстрое решение с f-string с:

df3["filename2"] = [f'{i}.{j}' for i,j in zip(df3["job_number"],df3["task_number"])]

Производительность в 30 тыс. Строк:

[ 112]
In [66]: %%timeit
    ...: df3["filename4"] = df3.T.apply(lambda x: str(x[0]) + '.' + str(x[1]))
    ...: 
1.7 s ± 31.6 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

In [67]: %%timeit
    ...: df3['dummy'] ='.'
    ...: res = df3['job_number'].values.astype(str) + df3['dummy'] + df3['task_number'].values.astype(str)
    ...: df3.drop(columns=['dummy'], inplace=True)
    ...: 
73.6 ms ± 1.23 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

Но оригинальное решение также очень быстрое:

In [73]: %%timeit
    ...: df3['filename'] = df3['job_number'].astype(str) + '.' + df3['task_number'].astype(str)
48.3 ms ± 872 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

С небольшой модификацией - вместо astype используется [118]:

In [76]: %%timeit
    ...: df3['filename'] = df3['job_number'].map(str) + '.' + df3['task_number'].map(str)
    ...: 
26 ms ± 676 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
0
ответ дан jezrael 3 March 2019 в 08:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: