如果数据框包含列中的列,则在列中查找不同的值

时间:2019-06-26 09:46:13

标签: python pandas

让我们假设我们具有以下数据框:

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

我需要一种适用于更多列的解决方案,我的原始数据框将包含几列,并且我不知道哪一个包含一个列表,而哪个不包含一个列表。

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.hstacknp.concatenate代替np.vstack,但是在这里,我想保留列值的二维性。