Cette question est la même pour ceci posté plus tôt. Je veux concaténer trois colonnes au lieu de concaténer deux colonnes:
Voici la combinaison de deux colonnes:
df = DataFrame({'foo':['a','b','c'], 'bar':[1, 2, 3], 'new':['Apple', 'banana', 'pear']})
df['combined']=df.apply(lambda x:'%s_%s' % (x['foo'],x['bar']),axis=1)
df
bar foo new combined
0 1 a Apple a_1
1 2 b banana b_2
2 3 c pear c_3
Je veux combiner trois colonnes avec cette commande mais cela ne fonctionne pas, une idée?
df['combined']=df.apply(lambda x:'%s_%s' % (x['bar'],x['foo'],x['new']),axis=1)
vous pouvez simplement faire:
In[17]:df['combined']=df['bar'].astype(str)+'_'+df['foo']+'_'+df['new']
In[17]:df
Out[18]:
bar foo new combined
0 1 a Apple 1_a_Apple
1 2 b banana 2_b_banana
2 3 c pear 3_c_pear
Je voulais juste faire une comparaison de temps pour les deux solutions (pour 30K lignes DF):
In [1]: df = DataFrame({'foo':['a','b','c'], 'bar':[1, 2, 3], 'new':['Apple', 'banana', 'pear']})
In [2]: big = pd.concat([df] * 10**4, ignore_index=True)
In [3]: big.shape
Out[3]: (30000, 3)
In [4]: %timeit big.apply(lambda x:'%s_%s_%s' % (x['bar'],x['foo'],x['new']),axis=1)
1 loop, best of 3: 881 ms per loop
In [5]: %timeit big['bar'].astype(str)+'_'+big['foo']+'_'+big['new']
10 loops, best of 3: 44.2 ms per loop
quelques options supplémentaires:
In [6]: %timeit big.ix[:, :-1].astype(str).add('_').sum(axis=1).str.cat(big.new)
10 loops, best of 3: 72.2 ms per loop
In [11]: %timeit big.astype(str).add('_').sum(axis=1).str[:-1]
10 loops, best of 3: 82.3 ms per loop
Je pense qu'il vous en manque un% s
df['combined']=df.apply(lambda x:'%s_%s_%s' % (x['bar'],x['foo'],x['new']),axis=1)
Si vous souhaitez combiner encore plus de colonnes, il peut être utile d'utiliser la méthode Series str.cat
:
df["combined"] = df["foo"].str.cat(df[["bar", "new"]].astype(str), sep="_")
En gros, vous sélectionnez la première colonne (si elle n’est pas déjà de type str
, vous devez ajouter .astype(str)
), à laquelle vous ajoutez les autres colonnes (séparées par un caractère de séparation facultatif).
Une autre solution utilisant DataFrame.apply()
, avec un peu moins de frappe et plus évolutif lorsque vous souhaitez joindre plus de colonnes:
cols = ['foo', 'bar', 'new']
df['combined'] = df[cols].apply(lambda row: '_'.join(row.values.astype(str)), axis=1)
df = DataFrame({'foo':['a','b','c'], 'bar':[1, 2, 3], 'new':['Apple', 'banana', 'pear']})
df['combined'] = df['foo'].astype(str)+'_'+df['bar'].astype(str)
Si vous concaténez avec une chaîne ('_'), convertissez la colonne en chaîne de votre choix, puis concaténez le cadre de données.
df['New_column_name'] = df['Column1'].map(str) + 'X' + df['Steps']
X = x est un délimiteur (par exemple, un espace) permettant de séparer deux colonnes fusionnées.