我有一个包含一列列表的数据框。
names unique_values
[B-PER,I-PER,I-PER,B-PER] 2
[I-PER,N-PER,B-PER,I-PER,A-PER] 4
[B-PER,A-PER,I-PER] 3
[B-PER, A-PER,A-PER,A-PER] 2
我必须计算一列列表中的每个不同值,如果值出现不止一次,则将其视为一个。我怎样才能实现它
谢谢
答案 0 :(得分:2)
将 explode
与 nunique
结合
df["unique_values"] = df.names.explode().groupby(level = 0).nunique()
答案 1 :(得分:1)
您可以使用 inbulit set
数据类型来执行此操作 -
df['unique_values'] = df['names'].apply(lambda a : len(set(a)))
这是因为集合在其构造中不允许任何重复元素,因此当您将列表转换为集合时,它会去除所有重复元素,您需要做的就是获取结果集的长度。
要忽略列表中的 NaN 值,您可以执行以下操作 -
df['unique_values'] = df['names'].apply(lambda a : len([x for x in set(a) if str(x) != 'nan']))
答案 2 :(得分:0)
试试:
df["unique_values"] = df.names.explode().groupby(level = 0).unique().str.len()
输出
df
names unique_values
0 [B-PER, I-PER, I-PER, B-PER] 2
1 [I-PER, N-PER, B-PER, I-PER, A-PER] 4
2 [B-PER, A-PER, I-PER] 3
3 [B-PER, A-PER, A-PER, A-PER] 2