Eu tenho um dataframe 20 x 4000 em Python usando pandas. Duas dessas colunas são nomeadas Year
e quarter
. Eu gostaria de criar uma variável chamada period
that makes Year = 2000
and quarter= q2
into 2000q2
.
Alguém pode ajudar com isso?
se as duas colunas forem cadeias, concatená-las diretamente:
df["period"] = df["Year"] + df["quarter"]
Se uma (ou ambas) das colunas não tiverem um tipo de string, você deve convertê-las (elas) primeiro,
df["period"] = df["Year"].astype(str) + df["quarter"]
Se você precisar ingressar em várias colunas de sequência, poderá usar agg
:
df['period'] = df[['Year', 'quarter', ...]].agg('-'.join, axis=1)
Onde "-" é o separador.
add(dataframe.iloc[:, 0:10])
por exemplo?sum
.dataframe["period"] = dataframe["Year"].map(str) + dataframe["quarter"].map(str)
mapeamento apenas aplicando a conversão de string a todas as entradas.Rende esse quadro de dados
Este método generaliza para um número arbitrário de colunas de sequência, substituindo
df[['Year', 'quarter']]
por qualquer fatia da coluna do seu quadro de dados, por exemplodf.iloc[:,0:2].apply(lambda x: ''.join(x), axis=1)
.Você pode verificar mais informações sobre o método apply () aqui
fonte
lambda x: ''.join(x)
é só''.join
, não?lambda x: ''.join(x)
construção não faz nada; é como usar emlambda x: sum(x)
vez de apenassum
.''.join
, isto é,:df['period'] = df[['Year', 'quarter']].apply(''.join, axis=1)
.join
leva apenasstr
instâncias em um iterável. Use amap
para convertê-los todos emstr
e depois usejoin
.Conjuntos de dados pequenos (<150 linhas)
ou um pouco mais lento, mas mais compacto:
Conjuntos de dados maiores (> 150 linhas)
ATUALIZAÇÃO: Gráfico de tempo Pandas 0.23.4
Vamos testá-lo em 200 mil linhas DF:
UPDATE: novos horários usando o Pandas 0.19.0
Tempo sem otimização da CPU / GPU (classificado do mais rápido para o mais lento):
Tempo usando otimização de CPU / GPU:
Responder contribuição de @ anton-vbr
fonte
df.T.apply(lambda x: x.str.cat(sep=''))
O método
cat()
do.str
acessador funciona muito bem para isso:cat()
ainda permite adicionar um separador, por exemplo, suponha que você só tenha números inteiros por ano e período, faça o seguinte:A união de várias colunas é apenas uma questão de passar uma lista de séries ou um quadro de dados contendo todos, exceto a primeira coluna, como um parâmetro a ser
str.cat()
invocado na primeira coluna (Série):Observe que, se o dataframe / series do pandas tiver valores nulos, você precisará incluir o parâmetro na_rep para substituir os valores de NaN por uma sequência, caso contrário, a coluna combinada será padronizada como NaN.
fonte
lambda
oumap
; também apenas lê de maneira mais limpa.str.cat()
. Vou alterar a respostasep
palavra - chave? nos pandas-0.23.4. Obrigado!sep
parâmetro é necessário apenas se você pretende separar as partes da sequência concatenada. Se você receber um erro, mostre-nos o seu exemplo com falha.Agora, use uma função lamba com string.format ().
Isso permite que você trabalhe com não-seqüências de caracteres e reformate valores, conforme necessário.
fonte
fonte
Year
não for uma stringdf['Year'].astype(str) + '' + df['quarter'].astype(str)
Embora a resposta @silvado é bom se você mudar
df.map(str)
paradf.astype(str)
ele vai ser mais rápido:fonte
Suponhamos que você
dataframe
estejadf
com colunasYear
eQuarter
.Suponha que queremos ver o quadro de dados;
Finalmente, concatenar o
Year
eoQuarter
da seguinte forma.Agora você pode
print
df
ver o quadro de dados resultante.Se você não deseja o espaço entre o ano e o trimestre, basta removê-lo fazendo;
fonte
df['Period'] = df['Year'].map(str) + df['Quarter'].map(str)
TypeError: Series cannot perform the operation +
quando corro umdf2['filename'] = df2['job_number'] + '.' + df2['task_number']
ou outrodf2['filename'] = df2['job_number'].map(str) + '.' + df2['task_number'].map(str)
.df2['filename'] = df2['job_number'].astype(str) + '.' + df2['task_number'].astype(str)
funcionou.dataframe
que criei acima, verá que todas as colunas sãostring
s.Aqui está uma implementação que eu acho muito versátil:
fonte
Como seus dados são inseridos em um quadro de dados, este comando deve resolver seu problema:
fonte
mais eficiente é
e aqui está um teste do tempo:
final, quando
sum
(concat_df_str2) é usado, o resultado não é simplesmente concat, ele será transferido para inteiro.fonte
df.values[:, 0:3]
oudf.values[:, [0,2]]
.generalizando para várias colunas, por que não:
fonte
O uso
zip
pode ser ainda mais rápido:Gráfico:
fonte
Solução mais simples:
Solução genérica
Pergunta specific solution
fonte
Esta solução usa uma etapa intermediária compactando duas colunas do DataFrame em uma única coluna contendo uma lista dos valores. Isso funciona não apenas para strings, mas para todos os tipos de tipos de coluna
Resultado:
fonte
Como muitos mencionaram anteriormente, você deve converter cada coluna em sequência e, em seguida, usar o operador mais para combinar duas colunas de sequência. Você pode obter uma grande melhoria de desempenho usando o NumPy.
fonte
df2['filename'] = df2['job_number'].values.astype(str) + '.' + df2['task_number'].values.astype(str)
-> Saída :TypeError: ufunc 'add' did not contain a loop with signature matching types dtype('<U21') dtype('<U21') dtype('<U21')
. Job_number e task_number são ints.df['Year'].values.astype(str) + df.quarter
Eu acho que a melhor maneira de combinar as colunas nos pandas é convertendo ambas as colunas em número inteiro e depois em str.
fonte
Aqui está o meu resumo das soluções acima para concatenar / combinar duas colunas com o valor int e str em uma nova coluna, usando um separador entre os valores das colunas. Três soluções funcionam para esse fim.
fonte
Use
.combine_first
.fonte
.combine_first
resultará no'Year'
armazenamento do valor'Period'
ou, se for nulo, no valor de'Quarter'
. Não concatenará as duas seqüências e as armazenará'Period'
.Por exemplo:
fonte
Pode-se usar atribuir método da trama de dados :
fonte
ou se os valores são como [2000] [4] e desejam criar [2000q4]
substituindo
.astype(str)
por.map(str)
obras também.fonte