我在dataframe
中有下面的一列,其中包含用|
分隔的颜色
df = pd.DataFrame({'x': ['RED|BROWN|YELLOW', 'WHITE|BLACK|YELLOW|GREEN', 'BLUE|RED|PINK']})
我想从列中找到所有唯一的颜色。
预期产量:
{'YELLOW', 'BLACK', 'RED', 'BLUE', 'BROWN', 'GREEN', 'WHITE', 'PINK'}
我不在乎它是list
还是set
。
我尝试过的事情:
df['x'] = df['x'].apply(lambda x: x.split("|"))
colors = []
for idx, row in df.iterrows():
colors.extend(row['x'])
print(set(colors))
哪个工作正常,但由于数据集很大,我正在寻找更有效的解决方案。
答案 0 :(得分:1)
set(df.loc[:, 'x'].str.split('|', expand=True).values.ravel())
或
set(df.loc[:, 'x'].str.split('|', expand=True).values.ravel()) - set([None])
答案 1 :(得分:1)
list(df.x.str.split('|', expand=True).stack().reset_index(name='x').drop_duplicates('x')['x'])
输出
['RED', 'BROWN', 'YELLOW', 'WHITE', 'BLACK', 'GREEN', 'BLUE', 'PINK']
答案 2 :(得分:1)
使用itertools
(可以说是使列表变平最快的方法)和set;
import itertools
set(itertools.chain.from_iterable(df.x.str.split('|')))
输出:
{'BLACK', 'BLUE', 'BROWN', 'GREEN', 'PINK', 'RED', 'WHITE', 'YELLOW'}
使用functools
的另一种可能的解决方案,其速度几乎与itertools一样快:
import functools
import operator
set(functools.reduce(operator.iadd, df.x.str.split('|'), []))
注意,您也可以使用sum()
,它看起来可读,但速度却不如以前。
答案 3 :(得分:1)
您也可以执行(define (convert input)
(define s(string))
(for ([i (string->list input)])
(when (char-alphabetic? i)
(let ((s(string-append s (string i))))
(display (string-upcase s))))))
这还将从输出中删除set(df['x'].str.split('|').values.sum())
None