2016-04-04 3 views
0

У меня есть следующий кадр данных:Python Панда dataframe: Сбор значений столбца

 var_1  var_2       item_list 
0   0   1   [beer, apple, pear, rice]  
1   0   1   [egg, banana, oil, pear] 
2   0   1     [beer, noodle]  
3   1   0     [tomato, milk]  
4   1   0       [apple] 

Можно ли собрать все элементы в item_list с помощью dataframe применить функцию? Результат должен быть примерно [beer, apple, pear, rice, egg, banana, oil, pear, ...] без дубликатов в списке.

Или мне нужно перебирать ячейки по ячейкам, чтобы собрать все значения в одном списке?

+1

Какой желаемый выход? Что значит собирать? – jezrael

ответ

1

Я думаю, что вы можете applySeries, stack и конвертировать tolist:

print df['item_list'].apply(pd.Series).stack().tolist() 
['beer', 'apple', 'pear', 'rice', 'egg', 'banana', 'oil', 
'pear', 'beer', 'noodle', 'tomato', 'milk', 'apple'] 

Если вам нужно удалить дубликаты использовать drop_duplicates или set:

print df['item_list'].apply(pd.Series).stack().drop_duplicates().tolist() 
['beer', 'apple', 'pear', 'rice', 'egg', 'banana', 'oil', 'noodle', 'tomato', 'milk'] 

print list(set(df['item_list'].apply(pd.Series).stack().tolist())) 
['tomato', 'oil', 'apple', 'pear', 'milk', 'beer', 'noodle', 'rice', 'egg', 'banana'] 

EDIT:

Если вам нужно удалить дубликаты в каждой строке:

print df['item_list'].apply(lambda x: pd.Series(list(set(x)))).stack().drop_duplicates().tolist() 
+0

спасибо. Но список, похоже, не удаляет дубликаты ... – Edamame

+0

Не проблема, дай мне время. – jezrael

+0

Спасибо! Одна проблема, с которой я столкнулся, - это первый шаг: df ['item_list']. Apply (pd.Series) .stack(). Drop_duplicates(). Tolist() действительно занимает много времени из-за размера набора данных. Например. «яблоко» на самом деле появляется 1 миллион раз в первом списке, что заставляет программу зависать ... Мне интересно, можно ли вообще не собирать все дубликаты в одном списке? – Edamame

2

Если DataFrame является df, то вы можете использовать

import itertools 

itertools.chain.from_iterable(df.item_list) 

создать итератор всех элементов. Если вы сделаете

list(itertools.chain.from_iterable(df.item_list)) 

тогда это станет списком.


Пример

import pandas as pd 

df = pd.DataFrame({'item_list': [[1, 2], [3, 4]]}) 

import itertools 

>>> list(itertools.chain.from_iterable(df.item_list.values)) 
[1, 2, 3, 4] 
+0

спасибо. Но список, похоже, не удаляет дубликаты ... возможно ли сначала не собирать дубликаты в списке ... например, у меня было бы 1 миллион «1», что делает невозможным собрать их в одном списке сначала ... – Edamame

1
> l= list(df['item_list'] 
> flattened_list = [item for sublist in l for item in sublist] 
> flattened = set(flattened_list) 
> pprint.pprint(flattened) 
{'apple', 
'banana', 
'beer', 
'egg', 
'milk', 
'noodle', 
'oil', 
'pear', 
'rice', 
'tomato'} 

Надежда, что помогает.

+0

Спасибо ... но это не удаляет дубликаты ... – Edamame

+0

Теперь, см. Мое редактирование – hd1

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