使用DataFrame.apply在每个列上调用unique函数

4

我一直想做以下工作,以便在 pandas.DataFrame 中的每个列上执行 pandas.DataFrame.someColumnName.unique() 函数,并具有一个简单的故事。

df.apply(func=unique, axis=0)  # error NameError: name 'unique' is not defined

我是否忽略了某些技巧来使这个工作正常,或者有没有其他解决方案,类似于使用 pandas.DataFrame 中的type()函数在每一列上进行操作。

df.apply(func=lambda x: type(x[0]), axis=0)

请注意,我已经能够使以下内容起作用,但在Python中似乎没有办法制作单行循环,而且我发现apply语句是更好的自我记录实现。
for col in df.columns: 
    df[col].unique()

动力来自于在新数据集上进行探索性数据分析[eda]时,我不仅想输出与每列相关联的类型,还想列出每列中存在的唯一值列表。这将定义实现处理空缺/NaN值和垃圾值的数据整理代码所需的下一步操作。 - myusrn
1
是的,pandas 不喜欢在数据帧中的不同列中传递给 apply 函数的结果大小不同......我猜这很可能发生在您的数据中。 - Tasko Olevski
2个回答

9

unique 不是全局环境中已注册的函数,您可以使用 set 来实现此功能:

df.apply(set)

如果使用 unique,请从 pandas 中引用它,同时最好将结果转换为列表,因为不能保证所有列都包含相同数量的唯一元素:
df.apply(lambda x: pd.unique(x).tolist())

3
如果您需要一行循环,可以这样做:
{e:df[e].unique() for e in df.columns}

这种方法将df ['colname'] .unique()输出打印到一起合并的每个列中,而不是每个输出由crlf分隔。我发现“for col in df.columns:df [col] .unique()”单行循环语法和两行语法需要执行任何后续的python脚本代码行才能执行循环。我发现我可以使用无操作的“pass”调用来满足这个需求。这是一个众所周知的for循环预期问题吗? - myusrn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接