web-dev-qa-db-fra.com

Comment combiner plusieurs rangées de chaînes en une seule en utilisant des pandas?

J'ai un DataFrame avec plusieurs lignes. Existe-t-il un moyen de les combiner pour former une seule chaîne?

Par exemple:

     words
0    I, will, hereby
1    am, gonna
2    going, far
3    to
4    do
5    this

Production attendue:

I, will, hereby, am, gonna, going, far, to, do, this
15
eclairs

Vous pouvez utiliser str.cat pour joindre les chaînes de chaque ligne. Pour une série ou une colonne s, écrivez:

>>> s.str.cat(sep=', ')
'I, will, hereby, am, gonna, going, far, to, do, this'
18
Alex Riley

Que diriez-vous du join du python traditionnel? Et c'est plus rapide.

In [209]: ', '.join(df.words)
Out[209]: 'I, will, hereby, am, gonna, going, far, to, do, this'

Timings en décembre 2016 le pandas 0.18.1

In [214]: df.shape
Out[214]: (6, 1)

In [215]: %timeit df.words.str.cat(sep=', ')
10000 loops, best of 3: 72.2 µs per loop

In [216]: %timeit ', '.join(df.words)
100000 loops, best of 3: 14 µs per loop

In [217]: df = pd.concat([df]*10000, ignore_index=True)

In [218]: df.shape
Out[218]: (60000, 1)

In [219]: %timeit df.words.str.cat(sep=', ')
100 loops, best of 3: 5.2 ms per loop

In [220]: %timeit ', '.join(df.words)
100 loops, best of 3: 1.91 ms per loop
10
Zero

Si vous avez un DataFrame plutôt qu'un Series et que vous souhaitez concaténer des valeurs (je pense que des valeurs de texte uniquement) à partir de différentes lignes basées sur une autre colonne en tant que clé 'group by', alors vous pouvez Utilisez le .agg méthode de la classe DataFrameGroupBy. Voici un lien vers le manuel de l'API .

Exemple de code testé avec Pandas v0.18.1:

import pandas as pd

df = pd.DataFrame({
    'category': ['A'] * 3 + ['B'] * 2,
    'name': ['A1', 'A2', 'A3', 'B1', 'B2'],
    'num': range(1, 6)
})

df.groupby('category').agg({
    'name': lambda x: ', '.join(x),
    'num': lambda x: x.max()
})
7
Zhong Dai

Pour tous ceux qui veulent savoir comment combiner plusieurs lignes de chaînes dans dataframe,
Je fournis une méthode qui peut concaténer des chaînes dans une plage "proche de la fenêtre" de lignes proches comme suit:

# add columns based on 'windows-like' rows
df['windows_key_list'] = pd.Series(df['key'].str.cat([df.groupby(['bycol']).shift(-i)['key'] for i in range(1, windows_size)], sep = ' ')

Remarque: Ceci ne peut pas être atteint par groupby, car nous ne voulons pas dire le même id de lignes, juste près des lignes.

0
Kevin Chou