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
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'
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
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()
})
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.