web-dev-qa-db-fra.com

Comment concaténer plusieurs valeurs de colonne en une seule colonne dans le cadre de données Panda

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)
6
NamAshena

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
28
shivsn

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
8
MaxU

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)
5
milos.ai

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).

3
cbrnr

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)
3
Allen
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. 

0
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.

0
Nipun Kumar Goel