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つのリストに戻すのに苦労しています。
ありがとう!
基本的に、ここではネストされたリストをフラット化しようとしています。
シリーズの要素を繰り返し処理できる必要があります。
slist =[]
for x in series:
slist.extend(x)
または、より簡潔な(しかし理解しにくい)リスト内包表記:
slist = [st for row in s for st in row]
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)
を省略します。
series_name.sum()
まさにあなたが必要とすることをします。それが一連のリストであることを確認してください。そうでない場合、値は連結されます(文字列の場合)または追加されます(intの場合)。
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
series_name.explode()
の問題は、それぞれの[]
はNaN
を追加します。
これを回避するために、別の方法を見つけました。
from itertools import chain
pd.Series(
chain.from_iterable(
value
for i, value
in series_name.iteritems()
)
)
この関数を使用して、平坦化と非平坦化を行うことができます
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
pandas version 0.25.0
series および 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
あなたも試すことができます:
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
以下のようなリスト連結演算子を使用できます-
_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']
_