【发布时间】:2020-01-27 21:09:30
【问题描述】:
我有一个参考列表
ref = ['September', 'August', 'July', 'June', 'May', 'April', 'March']
还有一个数据框
df = pd.DataFrame({'Month_List': [['July'], ['August'], ['July', 'June'], ['May', 'April', 'March']]})
df
Month_List
0 [July]
1 [August]
2 [July, June]
3 [May, April, March]
我想检查参考列表中的哪些元素存在于每一行中,并转换为二进制列表
我可以使用apply 实现这一点
def convert_month_to_binary(ref,lst):
s = pd.Series(ref)
return s.isin(lst).astype(int).tolist()
df['Binary_Month_List'] = df['Month_List'].apply(lambda x: convert_month_to_binary(ref, x))
df
Month_List Binary_Month_List
0 [July] [0, 0, 1, 0, 0, 0, 0]
1 [August] [0, 1, 0, 0, 0, 0, 0]
2 [July, June] [0, 0, 1, 1, 0, 0, 0]
3 [May, April, March] [0, 0, 0, 0, 1, 1, 1]
但是,在大型数据集上使用 apply 非常慢,因此我希望使用 numpy 向量化。如何提高我的表现?
扩展:
我想使用numpy vectorization,因为我现在需要在此列表中应用另一个函数
我正在尝试这样,但性能很慢。与apply 类似的结果
def count_one(lst):
index = [i for i, e in enumerate(lst) if e != 0]
return len(index)
vfunc = np.vectorize(count_one)
df['Value'] = vfunc(df['Binary_Month_List'])
【问题讨论】:
-
仅供参考 - 矢量化根据具体情况进行。如果您正在寻找一个适用于所有场景的神奇功能,则没有。