Использование zip
может быть еще более быстрым:
dataframe["period"] = ([''.join(i) for i in
zip(dataframe["Year"].map(str),dataframe["quarter"])])
В наборе данных ниже zip()
был наиболее удачным из всех: https://stackoverflow.com/a/50316945/ 7386332
import pandas as pd
data = '''\
ID,Host,Protocol,Port
1,10.0.0.10,tcp,445
1,10.0.0.10,tcp,445
1,10.0.0.10,tcp,445
1,10.0.0.10,tcp,445
1,10.0.0.10,tcp,445
1,10.0.0.10,tcp,445
1,10.0.0.10,tcp,445
1,10.0.0.10,tcp,49707
1,10.0.0.10,tcp,49672
1,10.0.0.10,tcp,49670'''
df = pd.read_csv(pd.compat.StringIO(data)) # Recreates a sample dataframe
df = pd.concat([df]*10000)
%timeit df['Host'] + "/" + df['Protocol'] + "/" + df['Port'].map(str)
%timeit ['/'.join(i) for i in zip(df['Host'],df['Protocol'],df['Port'].map(str))]
%timeit ['/'.join(i) for i in df[['Host','Protocol','Port']].astype(str).values]
10 loops, best of 3: 39.7 ms per loop
10 loops, best of 3: 35.9 ms per loop
10 loops, best of 3: 162 ms per loop
Унарный оператор +
может использоваться для преобразования значения в число в JavaScript. Подчеркивание, по-видимому, проверяет, что свойство .length
является числом, иначе оно не будет равно самому преобразованному в номер.
Хороший хак, чтобы проверить, имеет ли obj.length
тип number
или нет. Вы видите, что оператор +
может использоваться для принудительного принуждения строк. Например:
alert(+ "3" + 7); // alerts 10
Это возможно, потому что оператор +
принуждает строку "3"
к числу 3
. Следовательно, результатом является 10
, а не "37"
.
Кроме того, JavaScript имеет два типа операторов равенства и неравенства:
3 === "3"
выражает false). 3 == "3"
выражает истину). Строгое равенство и неравенство не заставляют ценность. Следовательно, число 3
не равно строке "3"
. Нормальное равенство и неравенство действительно ценят ценность. Следовательно, число 3
равно строке "3"
.
Теперь приведенный выше код просто принуждает obj.length
к числу с помощью оператора +
и строго проверяет, имеет ли значение до и после принуждения одинаковы (т.е. obj.length
типа number
). Это логически эквивалентно следующему коду (только более кратким):
if (typeof obj.length === "number") {
// code
}
Это способ гарантировать, что obj.length является числом, а не потенциальной строкой. Причиной этого является то, что === не удастся, если длина (по какой-либо причине) является строковой переменной, например. "3".
Согласно MDN :
Оператор унарного плюса предшествует своему операнду и вычисляет его операнд, но пытается преобразовать его в число, если оно не уже. Например, y = + x принимает значение x и присваивает это y; то есть, если x равно 3, y получит значение 3, а x сохранит значение 3; но если x является строкой «3», y также получит значение 3. Хотя унарное отрицание (-) также может конвертировать не числа, унарный плюс является самым быстрым и предпочтительным способом преобразования чего-либо в число, поскольку он не выполнять любые другие операции над номером. Он может преобразовывать строковые представления целых чисел и float, а также значения, отличные от строки, true, false и null. Поддерживаются целые числа в десятичных и шестнадцатеричных форматах («0x» -предоставляемые). Отрицательные числа поддерживаются (хотя и не для hex). Если он не может разобрать определенное значение, он будет оценивать NaN.
blockquote>