2017-10-09 4 views
1

は、未知のサイズ内側のリストのシリーズを考える:パンダ

import pandas as pd 
sr = pd.Series([['a', 'b', 'c', 'b'], ['a', 'a', 'd'], ['b']]) 

[出]:目標は、作成するために、内側のリスト内の値を使用することです

0 [a, b, c, b] 
1  [a, a, d] 
2    [b] 

各列のアイテムの数でその値を入力します。つまり、

 a b c d 
0 1.0 2.0 1.0 NaN 
1 2.0 NaN NaN 1.0 
2 NaN 1.0 NaN NaN 

私はtを達成しようとしましたそれぞれの行を反復処理し、Counterオブジェクトに変換するとカウンタ辞書のリストを使用してデータフレームを再作成することによって、上記彼:

>>> from collections import Counter 
>>> pd.DataFrame([dict(Counter(row)) for row in pd.Series([['a', 'b', 'c', 'b'], ['a', 'a', 'd'], ['b']])]) 

はこれを行うための簡単な方法はありますか?おそらく.pivot()で?

答えて

2

入力が前の質問のようlistであれば、私は思う:入力がSeriesある場合

lol = [['a', 'b', 'c', 'b'], ['a', 'a', 'd'], ['b']] 
df = pd.DataFrame(Counter(x) for x in lol) 
print (df) 
    a b c d 
0 1.0 2.0 1.0 NaN 
1 2.0 NaN NaN 1.0 
2 NaN 1.0 NaN NaN 

df = pd.DataFrame(sr.values.tolist()).apply(pd.value_counts, 1) 
print (df) 
    a b c d 
0 1.0 2.0 1.0 NaN 
1 2.0 NaN NaN 1.0 
2 NaN 1.0 NaN NaN 
2

使用

In [179]: pd.DataFrame(Counter(x) for x in sr) 
Out[179]: 
    a b c d 
0 1.0 2.0 1.0 NaN 
1 2.0 NaN NaN 1.0 
2 NaN 1.0 NaN NaN 

それとも

In [182]: sr.apply(lambda x: pd.Series(Counter(x))) 
Out[182]: 
    a b c d 
0 1.0 2.0 1.0 NaN 
1 2.0 NaN NaN 1.0 
2 NaN 1.0 NaN NaN 

それともvalue_counts

In [170]: sr.apply(lambda x: pd.Series(x).value_counts()) 
Out[170]: 
    a b c d 
0 1.0 2.0 1.0 NaN 
1 2.0 NaN NaN 1.0 
2 NaN 1.0 NaN NaN 

それとも

In [174]: pd.DataFrame(pd.Series(x).value_counts() for x in sr) 
Out[174]: 
    a b c d 
0 1.0 2.0 1.0 NaN 
1 2.0 NaN NaN 1.0 
2 NaN 1.0 NaN NaN