web-dev-qa-db-ja.com

Pandasリストのシリーズから1つのシリーズへ

Pandas文字列の一連のリスト:

0                           [slim, waist, man]
1                                [slim, waistline]
2                                     [santa]

ご覧のとおり、リストは長さによって異なります。これを1つのシリーズにまとめる効率的な方法が欲しい

0 slim
1 waist
2 man
3 slim
4 waistline
5 santa

私は使用してリストを分割できることを知っています

series_name.split(' ')

しかし、これらの文字列を1つのリストに戻すのに苦労しています。

ありがとう!

28
Max

基本的に、ここではネストされたリストをフラット化しようとしています。

シリーズの要素を繰り返し処理できる必要があります。

slist =[]
for x in series:
    slist.extend(x)

または、より簡潔な(しかし理解しにくい)リスト内包表記:

slist = [st for row in s for st in row]
10
tegancp

pandas関数のみを使用する簡単な方法を次に示します。

_import pandas as pd

s = pd.Series([
    ['slim', 'waist', 'man'],
    ['slim', 'waistline'],
    ['santa']])
_

その後

_s.apply(pd.Series).stack().reset_index(drop=True)
_

必要な出力を提供します。場合によっては、元のインデックスを保存し、ネストされた要素にインデックスを付けるために2番目のレベルを追加することができます。

_0  0         slim
   1        waist
   2          man
1  0         slim
   1    waistline
2  0        santa
_

これが必要な場合は、チェーンから.reset_index(drop=True)を省略します。

33
mcwitt
series_name.sum()

まさにあなたが必要とすることをします。それが一連​​のリストであることを確認してください。そうでない場合、値は連結されます(文字列の場合)または追加されます(intの場合)。

7
Tadej Magajna

Itertools.chainを使用して、リストを単純にフラット化することができます。

In [70]: from itertools import chain
In [71]: import pandas as pnd
In [72]: s = pnd.Series([['slim', 'waist', 'man'], ['slim', 'waistline'], ['santa']])
In [73]: s
Out[73]: 
0    [slim, waist, man]
1     [slim, waistline]
2               [santa]
dtype: object
In [74]: new_s = pnd.Series(list(chain(*s.values)))
In [75]: new_s
Out[75]: 
0         slim
1        waist
2          man
3         slim
4    waistline
5        santa
dtype: object
5
peterfields

series_name.explode()の問題は、それぞれの[]NaNを追加します。

これを回避するために、別の方法を見つけました。

from itertools import chain

pd.Series(
    chain.from_iterable(
        value
        for i, value
        in series_name.iteritems()
    )
)
0
EliadL

この関数を使用して、平坦化と非平坦化を行うことができます

def flatten(df, col):
    col_flat = pd.DataFrame([[i, x] for i, y in df[col].apply(list).iteritems() for x in y], columns=['I', col])
    col_flat = col_flat.set_index('I')
    df = df.drop(col, 1)
    df = df.merge(col_flat, left_index=True, right_index=True)

    return df

平坦化解除:

def unflatten(flat_df, col):
    flat_df.groupby(level=0).agg({**{c:'first' for c in flat_df.columns}, col: list})

展開後、列の順序を除いて同じデータフレームを取得します。

(df.sort_index(axis=1) == unflatten(flatten(df)).sort_index(axis=1)).all().all()
>> True
0
vozman

pandas version 0.25.0series および dataframes の新しいメソッド 'explode'が登場しました。古いバージョンにはそのような方法はありません。

必要な結果を構築するのに役立ちます。

たとえば、次のようなシリーズがあります。

import pandas as pd

s = pd.Series([
    ['slim', 'waist', 'man'],
    ['slim', 'waistline'],
    ['santa']])

その後、使用できます

s.explode()

そのような結果を得るには:

0         slim
0        waist
0          man
1         slim
1    waistline
2        santa

データフレームの場合:

df = pd.DataFrame({
  's': pd.Series([
    ['slim', 'waist', 'man'],
    ['slim', 'waistline'],
    ['santa']
   ]),
   'a': 1
})

あなたはそのようなDataFrameを持っています:

                    s  a
0  [slim, waist, man]  1
1   [slim, waistline]  1
2             [santa]  1

s列に分解を適用:

df.explode('s')

あなたにそのような結果を与えるでしょう:

           s  a
0       slim  1
0      waist  1
0        man  1
1       slim  1
1  waistline  1
2      santa  1
0
Roman Kotov

あなたも試すことができます:

combined = []
for i in s.index:
    combined = combined + s.iloc[i]

print(combined)

s = pd.Series(combined)
print(s)

出力:

['slim', 'waist', 'man', 'slim', 'waistline', 'santa']

0         slim
1        waist
2          man
3         slim
4    waistline
5        santa

dtype: object
0
Adarsh Namdev

以下のようなリスト連結演算子を使用できます-

_lst1 = ['hello','world']
lst2 = ['bye','world']
newlst = lst1 + lst2
print(newlst)
>> ['hello','world','bye','world']
_

または、以下のようにlist.extend()関数を使用できます-

_lst1 = ['hello','world']
lst2 = ['bye','world']
lst1.extend(lst2)
print(lst1)
>> ['hello', 'world', 'bye', 'world']
_

extend関数を使用する利点は、複数の型で機能できることです。concatenation演算子は、LHSとRHSの両方がリストである場合にのみ機能します。

extend関数の他の例-

_lst1.extend(('Bye','Bye'))
>> ['hello', 'world', 'Bye', 'Bye']
_
0
Anand S Kumar