有列表时如何获取数据框列的唯一值-Python

I.M*_*.M. 5 python unique pandas

我有以下数据框,我想在其中打印color列的唯一值。

df = pd.DataFrame({'colors': ['green', 'green', 'purple', ['yellow , red'], 'orange'], 'names': ['Terry', 'Nor', 'Franck', 'Pete', 'Agnes']})

Output:
           colors   names
0           green   Terry
1           green     Nor
2          purple  Franck
3  [yellow , red]    Pete
4          orange   Agnes
Run Code Online (Sandbox Code Playgroud)

df.colors.unique()如果没有那[yellow , red]排就可以了。因为它是我不断得到TypeError: unhashable type: 'list'可以理解的错误。

有没有办法在不考虑这一行的情况下仍然获得唯一值?

我尝试了以下方法,但没有任何效果:

df = df[~df.colors.str.contains(',', na=False)] # Nothing happens
df = df[~df.colors.str.contains('[', na=False)] # Output: error: unterminated character set at position 0
df = df[~df.colors.str.contains(']', na=False)] # Nothing happens
Run Code Online (Sandbox Code Playgroud)

jez*_*ael 3

如果值是列表,请通过方法检查isinstance

#changed sample data
df = pd.DataFrame({'colors': ['green', 'green', 'purple', ['yellow' , 'red'], 'orange'], 
                   'names': ['Terry', 'Nor', 'Franck', 'Pete', 'Agnes']})

df = df[~df.colors.map(lambda x : isinstance(x, list))]
print (df)
   colors   names
0   green   Terry
1   green     Nor
2  purple  Franck
4  orange   Agnes
Run Code Online (Sandbox Code Playgroud)

您的解决方案应该通过转换为字符串和regex=False参数来更改:

df = df[~df.colors.astype(str).str.contains('[', na=False, regex=False)] 
print (df)
   colors   names
0   green   Terry
1   green     Nor
2  purple  Franck
4  orange   Agnes
Run Code Online (Sandbox Code Playgroud)

另外,如果想要包含 pandas 0.25+ 的所有唯一值列表:

s = df.colors.map(lambda x : x if isinstance(x, list) else [x]).explode().unique().tolist()
print (s)
['green', 'purple', 'yellow', 'red', 'orange']
Run Code Online (Sandbox Code Playgroud)