使用“set”函数将列组合成唯一值
2018-07-18
72
我尝试使用 Python 3 中的“set”函数将列表中的唯一值放入不同的列中。但是我收到错误:“TypeError:'Series' 对象是可变的,因此无法对其进行哈希处理”。我在这里做错了什么?
示例数据:
id,food 1,food 2,food 3
1,,apples,mango
2,oranges,grapes,oranges
3,bananas,,apples
代码:
df = pd.read_csv('food.csv')
df
# pass
list(set(['apples','apples','oranges']))
# answers: ['apples', 'oranges'] #working
# fails if I pass in a dataframe columns. Why?
df['food_all'] = list(set([df['food 1'],df['food 2'],df['food 3']]))
df['food_all']
输出如下(忽略空格/空值...等):
id,food_all
1,['apples','mango']
2,['oranges','grapes']
3,['bananas','apples']
3个回答
这应该有效:
df = pd.read_csv('food.csv')
df['food_all'] = df[['food1','food2','food3']].apply(lambda x: ', '.join(sorted(set(x.dropna().astype(str)), reverse=False)), axis=1).values.tolist()
print(df)
结果:
food1 food2 food3 food_all 0 apples apples mango mango, apples 1 oranges grapes oranges grapes, oranges 2 bananas apples None bananas, apples
gripep
2018-07-18
您可以使用逐行
apply
df.apply(lambda x: list(set(x.dropna())), axis=1)
获取一组行值,其输出
0 [mango, apples]
1 [grapes, oranges]
2 [bananas, apples]
dtype: object
taras
2018-07-18
您需要使用
pd.concat
(或其他方法)为每个 DataFrame 列中的每个元素创建一个非唯一列表。然后,您可以将非唯一列表传递给
set
函数。
set(pd.concat([df['food 1'],df['food 2'],df['food 3']]))
编辑
抱歉,我第一次阅读问题时误解了您想要的输出。这将为您提供所需的输出:
def get_set(row):
return set([row['food 1'], row['food 2'], row['food 3']])
df['food_all'] = df.apply(get_set, axis=1)
这是因为,正如错误所述,您只能将可哈希对象传递给集合。如
此处
所述,引用
此来源
,集合在内部使用对象的哈希值,因此传递给集合的任何项目都必须是可哈希的。由于您用于构造集合的列表中的项目是
Series
对象,而这些对象不可哈希,因此您不能使用该列表来构造集合。
gaw89
2018-07-18