【发布时间】:2022-01-20 00:13:28
【问题描述】:
我有一个 pandas DataFrame,其中名为 myenum 的列的值是 0、1 或 2。我正在尝试将 1s 和 2s 转换为字符串并使用 Enum 的 .name 属性来提供帮助。
我认为这是一个关于理解 np.where 与 np.vectorize 的胆量的问题,因为它们与 DataFrame 系列相关。我很好奇为什么尝试使用 np.where 会引发错误,但使用 np.vectorize 可以工作。我想从中学习并更好地了解 DataFrames 中的最佳矢量化实践。
import enum
import numpy as np
import pandas as pd
df = pd.DataFrame() # one column in this df is 'myenum', its values are either 0, 1, or 2
df['myenum'] = [0, 1, 2, 0, 0, 0, 2, 1, 0]
class MyEnum(enum.Enum):
First = 1
Second = 2
# this throws a TypeError - why?
df['myenum'] = np.where(
df['myenum'] > 0,
MyEnum(df['myenum']).name,
''
)
# whereas this, which seems pretty analagous, works. what am i missing?
def vectorize_enum_value(x):
if x > 0:
return MyEnum(x).name
return ''
vect = np.vectorize(vectorize_enum_value)
df['myenum'] = vect(df['myenum'])
【问题讨论】:
-
MyEnum(df['myenum']).name永远无法工作。MyEnum构造函数不是numpy或pandas的一部分,并且不知道传递数组时要做什么。您确实需要vectorize或apply。 -
@Tim Roberts 谢谢 - 所以教训是,要使用 np.where,你必须只在 numpy 知道如何做的 where 子句内执行操作?这就说得通了。并且 vectorize 是一种有效的解决方法,可能比 apply 更快(尽管考虑测试?)。谢谢。
-
基本上,是的。
numpy和pandas对象和函数知道如何处理向量和数组,但是您必须使用 apply 和 vectorize 之类的东西来获得“不知道”的函数。 -
谢谢。也许更具体的课程是“仅在 numpy 知道如何执行的 where 调用 on 数组 内执行操作”。我有资格获得 on the array 因为在查看我的其他一些工作 np.where 用法时,我确实经常引入自己的课程,但在你的帮助下,我意识到我从未通过我的课程数组...
-
np.where仅与cond参数一样好:df['myenum'] > 0。在 Python 中,函数参数首先被计算,然后传递给函数。where不是迭代器或“魔术”。我打算用演示写一个完整的答案,但你没有提供有效的数据框。np.vectorize不是特别快;这就像一个列表理解。但是pandas.apply很慢,除非你指定raw模式。
标签: python pandas dataframe numpy vector