web-dev-qa-db-ja.com

パンダを使用して文字列の複数の行を1つに結合する方法は?

複数の行を持つDataFrameがあります。それらを組み合わせて1つの文字列を形成する方法はありますか?

例えば:

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

期待される出力:

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

str.catを使用して、各行の文字列を結合できます。シリーズまたは列sの場合、次のように記述します。

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

従来のpythonのjoinはどうですか?そして、それは高速です。

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

2016年12月のタイミング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

DataFrameではなくSeriesがあり、「group by」キーとして別の列に基づいて異なる行の値(テキスト値のみだと思います)を連結する場合、次のことができます。使用 .aggクラスのDataFrameGroupByのメソッド。 APIマニュアルへのリンク です。

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

dataframeの文字列の複数の行を結合する方法を知りたい人のために、
次のように、「ウィンドウのような」近い行の範囲内で文字列を連結できるメソッドを提供します。

# 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 = ' ')

注:groupbyでこれに到達することはできません。なぜなら、行の同じIDを意味するのではなく、行の近くにいるからです。

0
Kevin Chou