У меня есть 20 x 4000 данных в Python с использованием панд. Два из этих столбцов названы Year
и quarter
. Я хотел бы создать переменную с именем, period
которая делает Year = 2000
и quarter= q2
в2000q2
.
Кто-нибудь может помочь с этим?
если оба столбца являются строками, вы можете объединить их напрямую:
df["period"] = df["Year"] + df["quarter"]
Если один (или оба) столбца не являются строковыми типами, вы должны сначала преобразовать их (их),
df["period"] = df["Year"].astype(str) + df["quarter"]
Если вам нужно объединить несколько строковых столбцов, вы можете использовать agg
:
df['period'] = df[['Year', 'quarter', ...]].agg('-'.join, axis=1)
Где "-" - это разделитель.
add(dataframe.iloc[:, 0:10])
для примера?sum
.dataframe["period"] = dataframe["Year"].map(str) + dataframe["quarter"].map(str)
карта просто применяет преобразование строк ко всем записям.Получает этот фрейм данных
Этот метод обобщает произвольное количество строковых столбцов, заменяя
df[['Year', 'quarter']]
любой фрагмент столбца вашего информационного кадра, например,df.iloc[:,0:2].apply(lambda x: ''.join(x), axis=1)
.Вы можете проверить больше информации о методе apply () здесь
источник
lambda x: ''.join(x)
просто''.join
нет?lambda x: ''.join(x)
конструкции ничего не делает; это как использоватьlambda x: sum(x)
вместо простоsum
.''.join
, а именно:df['period'] = df[['Year', 'quarter']].apply(''.join, axis=1)
.join
принимает толькоstr
экземпляры в итерации. Используйте,map
чтобы преобразовать их всех вstr
и затем использоватьjoin
.Небольшие наборы данных (<150 строк)
или немного медленнее, но более компактно:
Большие наборы данных (> 150 строк)
ОБНОВИТЬ: График времени Pandas 0.23.4
Давайте проверим это на 200K строк DF:
ОБНОВЛЕНИЕ: новые тайминги с использованием Pandas 0.19.0
Время без оптимизации CPU / GPU (отсортировано от самого быстрого до самого медленного):
Время с использованием оптимизации CPU / GPU:
Ответить вклад @ anton-vbr
источник
df.T.apply(lambda x: x.str.cat(sep=''))
Для
cat()
этого.str
очень хорошо работает метод доступа :cat()
даже позволяет добавить разделитель, поэтому, например, предположим, что у вас есть только целые числа для года и периода, вы можете сделать это:Присоединение к нескольким столбцам - это просто передача списка серий или кадра данных, содержащих все столбцы, кроме первого, в качестве параметра,
str.cat()
вызываемого в первом столбце (серии):Обратите внимание, что если ваш кадр данных / серия pandas имеет нулевые значения, вам нужно включить параметр na_rep, чтобы заменить значения NaN строкой, в противном случае для объединенного столбца будет по умолчанию значение NaN.
источник
lambda
илиmap
; также это только читает наиболее чисто.str.cat()
. Яsep
ключевое слово? в пандах - 0,23,4. Спасибо!sep
Параметр необходим только если вы намерены отделить части сцепленной строки. Если вы получили ошибку, пожалуйста, покажите нам ваш неудачный пример.Использование функции lamba на этот раз с string.format ().
Это позволяет вам работать с не-строками и переформатировать значения по мере необходимости.
источник
источник
Year
не строкаdf['Year'].astype(str) + '' + df['quarter'].astype(str)
Хотя ответ @silvado хорош, если вы перейдете
df.map(str)
наdf.astype(str)
него, он будет быстрее:источник
Давайте предположим , что ваш
dataframe
ISdf
с колоннамиYear
иQuarter
.Предположим, мы хотим увидеть фрейм данных;
Наконец, объедините
Year
иQuarter
следующим образом.Теперь вы можете
print
df
увидеть результирующий кадр данных.Если вам не нужно пространство между годом и кварталом, просто удалите его, выполнив;
источник
df['Period'] = df['Year'].map(str) + df['Quarter'].map(str)
TypeError: Series cannot perform the operation +
когда я бегуdf2['filename'] = df2['job_number'] + '.' + df2['task_number']
илиdf2['filename'] = df2['job_number'].map(str) + '.' + df2['task_number'].map(str)
.df2['filename'] = df2['job_number'].astype(str) + '.' + df2['task_number'].astype(str)
не менее, сделал работу.dataframe
который я создал выше, вы увидите, что все столбцыstring
s.Вот реализация, которую я нахожу очень универсальной:
источник
Когда ваши данные вставляются в фрейм данных, эта команда должна решить вашу проблему:
источник
более эффективным является
и вот тест времени:
final, когда
sum
(concat_df_str2) используется, результат не просто concat, он будет преобразован в целое число.источник
df.values[:, 0:3]
илиdf.values[:, [0,2]]
.обобщая на несколько столбцов, почему бы и нет:
источник
Использование
zip
может быть еще быстрее:График:
источник
Самое простое решение:
Общее решение
Вопрос конкретное решение
источник
Это решение использует промежуточный этап сжатия двух столбцов DataFrame в один столбец, содержащий список значений. Это работает не только для строк, но и для всех типов столбцов dtypes
Результат:
источник
Как уже упоминалось ранее, вы должны преобразовать каждый столбец в строку, а затем использовать оператор «плюс» для объединения двух строковых столбцов. Вы можете получить значительное улучшение производительности, используя NumPy.
источник
df2['filename'] = df2['job_number'].values.astype(str) + '.' + df2['task_number'].values.astype(str)
-> Вывод :TypeError: ufunc 'add' did not contain a loop with signature matching types dtype('<U21') dtype('<U21') dtype('<U21')
. И job_number, и task_number являются целыми числами.df['Year'].values.astype(str) + df.quarter
Я думаю, что лучший способ объединить столбцы в пандах - это преобразовать оба столбца в целое, а затем в str.
источник
Вот мое резюме вышеупомянутых решений, чтобы объединить / объединить два столбца со значениями int и str в новый столбец, используя разделитель между значениями столбцов. Три решения работают для этой цели.
источник
Использование
.combine_first
.источник
.combine_first
приведет к тому, что значение'Year'
будет сохранено в'Period'
, или, если оно равно Null, значение из'Quarter'
. Он не объединит две строки и не сохранит их'Period'
.Например:
источник
Можно использовать метод присвоения DataFrame :
источник
или если значения похожи на [2000] [4] и хотите сделать [2000q4]
подставляя
.astype(str)
с.map(str)
работой тоже.источник