让我们假设我们具有以下数据框:
d = {'col1': [[1,2], [1,2], [2,1]], 'col2': ['A', 'B', 'C']}
df = pd.DataFrame(data=d)
df
col1 col2
[1, 2] A
[1, 2] B
[2, 1] C
在数据框的某列中有一个列表的地方,如何计算每列中的不同值?
函数df.nunique()
无法正常工作,会出现此错误:TypeError: ("unhashable type: 'list'", 'occurred at index :97A::SAFE')
预期输出为:
col1 2
col2 3
我需要一种适用于更多列的解决方案,我的原始数据框将包含几列,并且我不知道哪一个包含一个列表,而哪个不包含一个列表。
答案 0 :(得分:3)
对于包含列表的列,您可以将值映射到tuples
,可散列的,然后使用nunique
:
df.col1.map(tuple).nunique()
# 2
df['col1'] = df.col1.map(tuple)
df.nunique()
col1 2
col2 3
dtype: int64
如果您不知道哪些列可能包含列表:
df.applymap(tuple).nunique()
col1 2
col2 3
dtype: int64
或专门检查哪些列包含列表:
cols = [i for i, ix in enumerate(df.loc[0].values) if isinstance(ix, list)]
df.iloc[:,cols] = df.iloc[:,cols].applymap(tuple)
df.nunique()
答案 1 :(得分:2)
如果您没有数据相等性和字符串表示形式不同的类型,那么我会将整个数据框转换为字符串:
df.astype(str).nunique()
对于您的示例,数据帧是预期的:
col1 2
col2 3
dtype: int64
答案 2 :(得分:1)
要获取列中的唯一值,您可以
import numpy as np
np.unique(np.vstack(df['col1'].values))
并获取唯一值的数量:
len(np.unique(np.vstack(df['col1'].values)))
您也可以使用np.hstack
或np.concatenate
代替np.vstack
,但是在这里,我想保留列值的二维性。