在熊猫列中查找唯一值,其中每一行都有多个值

时间:2019-03-25 05:25:32

标签: python python-3.x pandas

我在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))

哪个工作正常,但由于数据集很大,我正在寻找更有效的解决方案。

4 个答案:

答案 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