我有以下数据框:
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中的所有项目?输出应该类似[beer, apple, pear, rice, egg, banana, oil, pear, ...]
,列表中没有重复项。
或者我必须逐个单元地迭代以将所有值收集到一个列表中?
答案 0 :(得分: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]
答案 1 :(得分:2)
我认为您可以apply
Series
,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']
编辑:
如果您需要首先删除每行中的重复项:
print df['item_list'].apply(lambda x: pd.Series(list(set(x)))).stack().drop_duplicates().tolist()
答案 2 :(得分: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'}
希望有所帮助。