J'ai une trame de données 20 x 4000 en Python utilisant des pandas. Deux de ces colonnes sont nommées Year
et quarter
. Je voudrais créer une variable appelée period
qui fait Year = 2000
et quarter= q2
en 2000q2
.
Quelqu'un peut-il aider avec ça?
add(dataframe.iloc[:, 0:10])
par exemple?sum
.dataframe["period"] = dataframe["Year"].map(str) + dataframe["quarter"].map(str)
carte applique simplement la conversion de chaîne à toutes les entrées.Donne cette trame de données
Cette méthode se généralise à un nombre arbitraire de colonnes de chaîne en remplaçant
df[['Year', 'quarter']]
par n'importe quelle tranche de colonne de votre trame de données, par exempledf.iloc[:,0:2].apply(lambda x: ''.join(x), axis=1)
.Vous pouvez vérifier plus d'informations sur la méthode apply () ici
la source
lambda x: ''.join(x)
c'est juste''.join
, non?lambda x: ''.join(x)
construction ne fait rien; c'est comme utiliserlambda x: sum(x)
au lieu de justesum
.''.join
, à savoir:df['period'] = df[['Year', 'quarter']].apply(''.join, axis=1)
.join
ne prend que desstr
instances dans un itérable. Utilisez unmap
pour les convertir tousstr
, puis utilisezjoin
.Petits ensembles de données (<150 lignes)
ou légèrement plus lent mais plus compact:
Ensembles de données plus grands (> 150 lignes)
MISE À JOUR: Graphique de synchronisation Pandas 0.23.4
Testons-le sur 200K lignes DF:
MISE À JOUR: nouveaux timings utilisant Pandas 0.19.0
Timing sans optimisation CPU / GPU (trié du plus rapide au plus lent):
Timing utilisant l'optimisation CPU / GPU:
Répondre contribution par @ anton-vbr
la source
df.T.apply(lambda x: x.str.cat(sep=''))
La méthode
cat()
de l'.str
accesseur fonctionne très bien pour cela:cat()
vous permet même d'ajouter un séparateur. Par exemple, supposons que vous ne disposiez que d'entiers pour l'année et la période, vous pouvez le faire:Rejoindre plusieurs colonnes consiste simplement à passer soit une liste de séries, soit une trame de données contenant tout sauf la première colonne comme paramètre à
str.cat()
appeler sur la première colonne (série):Notez que si votre base de données / série pandas a des valeurs nulles, vous devez inclure le paramètre na_rep pour remplacer les valeurs NaN par une chaîne, sinon la colonne combinée sera par défaut NaN.
la source
lambda
oumap
; en outre, il se lit très simplement.str.cat()
. Je vais modifier la réponsesep
mot clé? chez les pandas-0,23.4. Merci!sep
paramètre n'est nécessaire que si vous avez l'intention de séparer les parties de la chaîne concaténée. Si vous obtenez une erreur, veuillez nous montrer votre exemple d'échec.Utilisation d'une fonction lamba cette fois avec string.format ().
Cela vous permet de travailler avec des non-chaînes et de reformater les valeurs selon vos besoins.
la source
la source
Year
n'est pas une chaînedf['Year'].astype(str) + '' + df['quarter'].astype(str)
Bien que la réponse @silvado est bon si vous changez
df.map(str)
àdf.astype(str)
ce sera plus rapide:la source
Supposons que votre
dataframe
estdf
avec des colonnesYear
etQuarter
.Supposons que nous voulons voir la trame de données;
Enfin, concaténez le
Year
et leQuarter
comme suit.Vous pouvez maintenant
print
df
voir la trame de données résultante.Si vous ne voulez pas l'espace entre l'année et le trimestre, supprimez-le simplement en faisant;
la source
df['Period'] = df['Year'].map(str) + df['Quarter'].map(str)
TypeError: Series cannot perform the operation +
quand je coursdf2['filename'] = df2['job_number'] + '.' + df2['task_number']
oudf2['filename'] = df2['job_number'].map(str) + '.' + df2['task_number'].map(str)
.df2['filename'] = df2['job_number'].astype(str) + '.' + df2['task_number'].astype(str)
a fonctionné.dataframe
que j'ai créé ci-dessus, vous verrez que toutes les colonnes sontstring
s.Voici une implémentation que je trouve très polyvalente:
la source
Lorsque vos données sont insérées dans une trame de données, cette commande devrait résoudre votre problème:
la source
plus efficace est
et voici un test de temps:
final, lorsque
sum
(concat_df_str2) est utilisé, le résultat n'est pas simplement concat, il sera trans en entier.la source
df.values[:, 0:3]
oudf.values[:, [0,2]]
.généraliser à plusieurs colonnes, pourquoi pas:
la source
L'utilisation
zip
pourrait être encore plus rapide:Graphique:
la source
Solution la plus simple:
Solution générique
Question solution spécifique
la source
Cette solution utilise une étape intermédiaire de compression de deux colonnes du DataFrame en une seule colonne contenant une liste des valeurs. Cela fonctionne non seulement pour les chaînes mais pour toutes sortes de types de colonnes
Résultat:
la source
Comme beaucoup l'ont mentionné précédemment, vous devez convertir chaque colonne en chaîne, puis utiliser l'opérateur plus pour combiner deux colonnes de chaîne. Vous pouvez obtenir une amélioration importante des performances en utilisant NumPy.
la source
df2['filename'] = df2['job_number'].values.astype(str) + '.' + df2['task_number'].values.astype(str)
-> Sortie :TypeError: ufunc 'add' did not contain a loop with signature matching types dtype('<U21') dtype('<U21') dtype('<U21')
. Job_number et task_number sont tous deux des entiers.df['Year'].values.astype(str) + df.quarter
Je pense que la meilleure façon de combiner les colonnes dans pandas est de convertir les deux colonnes en entier puis en str.
la source
Voici mon résumé des solutions ci-dessus pour concaténer / combiner deux colonnes avec des valeurs int et str dans une nouvelle colonne, en utilisant un séparateur entre les valeurs des colonnes. Trois solutions fonctionnent à cet effet.
la source
Utilisez
.combine_first
.la source
.combine_first
entraînera soit la valeur d''Year'
être stockée dans'Period'
, soit, si elle est Null, la valeur de'Quarter'
. Il ne concatène pas les deux chaînes et ne les stocke pas'Period'
.Par exemple:
la source
On peut utiliser assign méthode de dataframe :
la source
ou si les valeurs sont comme [2000] [4] et veulent faire [2000q4]
substituer
.astype(str)
avec des.map(str)
œuvres aussi.la source