2016-08-11 13 views
3

1つのユニークなリストに列内のすべてのリストをコンパイルする方法:Pythonのパンダ:私は以下のようにパンダのデータフレーム持って

enter image description here

私は(「ヴァル」欄に)すべてのリストを組み合わせることができますどのようにユニークなリスト(セット)に、例えば[val1, val2, val33, val9, val6, val7]

私はこれを次のコードで解決できます。私は、データフレームの行を反復せずに列からすべての一意の値を取得する簡単な方法があるのだろうか?

def_contributors=[] 
for index, row in df.iterrows(): 
    contri = ast.literal_eval(row['val']) 
    def_contributors.extend(contri) 
def_contributors = list(set(def_contributors)) 

答えて

6

ネストされたlistsSeriesをエクスポートして、リストを平らにするsetを適用して別の解決策:

df = pd.DataFrame({'id':['a','b', 'c'], 'val':[['val1','val2'], 
               ['val33','val9','val6'], 
               ['val2','val6','val7']]}) 

print (df) 
    id     val 
0 a   [val1, val2] 
1 b [val33, val9, val6] 
2 c [val2, val6, val7] 

print (type(df.val.ix[0])) 
<class 'list'> 

print (df.val.tolist()) 
[['val1', 'val2'], ['val33', 'val9', 'val6'], ['val2', 'val6', 'val7']] 

print (list(set([a for b in df.val.tolist() for a in b]))) 
['val7', 'val1', 'val6', 'val33', 'val2', 'val9'] 

タイミング

df = pd.concat([df]*1000).reset_index(drop=True) 

In [307]: %timeit (df['val'].apply(pd.Series).stack().unique()).tolist() 
1 loop, best of 3: 410 ms per loop 

In [355]: %timeit (pd.Series(sum(df.val.tolist(),[])).unique().tolist()) 
10 loops, best of 3: 31.9 ms per loop 

In [308]: %timeit np.unique(np.hstack(df.val)).tolist() 
100 loops, best of 3: 10.7 ms per loop 

In [309]: %timeit (list(set([a for b in df.val.tolist() for a in b]))) 
1000 loops, best of 3: 558 µs per loop 

タイプの場合listしかしstring使用str.stripstr.splitではありません。

df = pd.DataFrame({'id':['a','b', 'c'], 'val':["[val1,val2]", 
               "[val33,val9,val6]", 
               "[val2,val6,val7]"]}) 

print (df) 
    id    val 
0 a  [val1,val2] 
1 b [val33,val9,val6] 
2 c [val2,val6,val7] 

print (type(df.val.ix[0])) 
<class 'str'> 

print (df.val.str.strip('[]').str.split(',')) 
0   [val1, val2] 
1 [val33, val9, val6] 
2  [val2, val6, val7] 
Name: val, dtype: object 

print (list(set([a for b in df.val.str.strip('[]').str.split(',') for a in b]))) 
['val7', 'val1', 'val6', 'val33', 'val2', 'val9'] 
+0

私は、これを追加しました:conve rters = {"val":literal_eval} – kitchenprinzessin

3

この列を.apply(pd.Series)のDataFrameに変換します。列を積み重ねると、返されたシリーズでuniqueメソッドを呼び出すことができます。

df 
Out[123]: 
      val 
0  [v1, v2] 
1  [v3, v2] 
2 [v4, v3, v2] 

df['val'].apply(pd.Series).stack().unique() 
Out[124]: array(['v1', 'v2', 'v3', 'v4'], dtype=object) 
1

あなたが希望listを得るために、いくつかのstringの操作に続いてstr.concatを使用することができます。あなたにリストをしたい場合は

np.unique(np.hstack(df.val)) 

-

In [60]: import re 
    ...: from collections import OrderedDict 

In [62]: s = df['val'].str.cat() 

In [63]: L = re.sub('[[]|[]]',' ', s).strip().replace(" ",',').split(',') 

In [64]: list(OrderedDict.fromkeys(L)) 
Out[64]: ['val1', 'val2', 'val33', 'val9', 'val6', 'val7'] 
0

一つの方法は、np.hstackを使用して配列にそれらの要素を抽出してくれそうのようなユニークな要素の配列を与えることnp.uniqueを使用することです出力は、.tolist()を追加 - CSVファイルをインポートするときのval列がリストオブジェクトタイプとして認識されるように

np.unique(np.hstack(df.val)).tolist() 
+0

非常に興味深いですが、あなたの解決策は 'set'でリストの理解力としてはより速くなると思います。 – jezrael

+0

@jezraelうん、 'hstack'は私が推測するところではあまり役に立たない。ああ、私が最後にやったことはありませんし、さらに遅いです! – Divakar

+0

これはもっと遅い 'In [310]:%timeit np.unique(np.concatenate(df.val)) ループ10個、最高3:39.6 ms /ループ' – jezrael

関連する問題