2016-09-14 5 views
4

Рассмотрим следующий пример dataframePandas: как получить уникальные значения столбца, который содержит список значений?

df = pd.DataFrame({'name' : [['one two','three four'], ['one'],[], [],['one two'],['three']], 
        'col' : ['A','B','A','B','A','B']})  
df.sort_values(by='col',inplace=True) 

df 
Out[62]: 
    col     name 
0 A [one two, three four] 
2 A      [] 
4 A    [one two] 
1 B     [one] 
3 B      [] 
5 B    [three] 

Я хотел бы получить столбец, который отслеживает все уникальные строки, включенные в name для каждой комбинации col.

То есть, ожидается выход

df 
Out[62]: 
    col     name unique_list 
0 A [one two, three four] [one two, three four] 
2 A      [] [one two, three four] 
4 A    [one two] [one two, three four] 
1 B     [one] [one, three] 
3 B      [] [one, three] 
5 B    [three] [one, three] 

Действительно, например, для группы А, вы можете увидеть, что уникальный набор строк, включенных в [one two, three four], [] и [one two] является [one two]

я могу получить соответствующее число уникальных значений с использованием Pandas : how to get the unique number of values in cells when cells contain lists?:

df['count_unique']=df.groupby('col')['name'].transform(lambda x: list(pd.Series(x.apply(pd.Series).stack().reset_index(drop=True, level=1).nunique()))) 


df 
Out[65]: 
    col     name count_unique 
0 A [one two, three four]   2 
2 A      []   2 
4 A    [one two]   2 
1 B     [one]   2 
3 B      []   2 
5 B    [three]   2 

, но замена nunique на unique выше не удалась.

Любые идеи? Спасибо!

ответ

2

Вот решение

df['unique_list'] = df.col.map(df.groupby('col')['name'].sum().apply(np.unique)) 
    df 

enter image description here

+0

интересно. 'sum' со строками ?! –

+1

@Noobie это хуже, чем это. Это солнце в списке списков. Он создает объединенный список, над которым я применяю np.unique – piRSquared

+0

hehehe. я просто попытался, но кажется, что ваши хорошие решения терпят неудачу, когда отсутствуют значения для col. В этом случае я получаю 'TypeError: может только конкатенировать список (а не« int ») для списка'. Замена отсутствующих значений на 'fillna ('')' или 'fillna ('[]')' не работает. Есть идеи? –

2

Try:

uniq_df = df.groupby('col')['name'].apply(lambda x: list(set(reduce(lambda y,z: y+z,x)))).reset_index() 
uniq_df.columns = ['col','uniq_list'] 
pd.merge(df,uniq_df, on='col', how='left') 

Желаемый результат:

col     name    uniq_list 
0 A [one two, three four] [one two, three four] 
1 A      [] [one two, three four] 
2 A    [one two] [one two, three four] 
3 B     [one]   [three, one] 
4 B      []   [three, one] 
5 B    [three]   [three, one] 
+0

благодаря @abdou! позвольте мне попробовать, что –

Смежные вопросы