我有以下数据框,我想在其中打印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
如果没有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
答案 0 :(得分: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
您的解决方案应通过强制转换为字符串和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
如果还希望包括所有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']
答案 1 :(得分:2)
让我们使用type
df.colors.apply(lambda x : type(x)!=list)
0 True
1 True
2 True
3 False
4 True
Name: colors, dtype: bool
答案 2 :(得分:1)
指定的输入具有一个字符串,该字符串是一个列表(由发帖者指定),因此转换为字符串列表。
# Required Import
from ast import literal_eval
df = pd.DataFrame({
'colors': ['green', 'green', 'purple', "['yellow' , 'red']", 'orange'],
'names': ['Terry', 'Nor', 'Franck', 'Pete', 'Agnes']
})
从字面意义上讲,以便仅在列表为字符串的情况下才将字符串隐藏到实际列表
list_records = df.colors.str.contains('[', na=False, regex=False)
df.loc[list_records, 'colors'] = df.loc[list_records, 'colors'].apply(literal_eval)
使用熊猫> = 0.25
df.explode('colors')['colors'].unique()
给予
['green', 'purple', 'yellow', 'red', 'orange']
答案 3 :(得分:1)
假设数据框中的每个值都很重要,这是我经常用于“解压缩列表”的一种技术:
import re
def unlock_list_from_string(string, delim=','):
"""
lists are stored as strings (in csv files) ex. '[1,2,3]'
this function unlocks that list
"""
if type(string)!=str:
return string
# remove brackets
clean_string = re.sub('\[|\]', '', string)
unlocked_string = clean_string.split(delim)
unlocked_list = [x.strip() for x in unlocked_string]
return unlocked_list
all_colors_nested = df['colors'].apply(unlock_list_from_string)
# unnest
all_colors = [x for y in all_colors_nested for x in y ]
print(all_colors)
# ['green', 'green', 'purple', 'yellow', 'red', 'orange']