我有一个数据框架,它包含两列数字和第三列重复字母。让我们这样说:
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randint(0,100,size=(100, 2)), columns=list('xy'))
letters = ['A', 'B', 'C', 'D'] * int(len(df.index) / 4)
df['letters'] = letters
我想创建两个新列,将“x”和“y”列中的数字与其对应字母的平均值进行比较。例如,一个新列将只包含数字10(如果比平均值高20%)或-10(如果比平均值低20%)或0
我编写了以下函数:
def scoreFunHigh(dataField, mean, diff, multip):
upper = mean * (1 + diff)
lower = mean * (1 - diff)
if dataField > upper:
return multip * 1
elif dataField < lower:
return multip * (-1)
else:
return 0
然后创建列,如下所示:
letterMeanX = df.groupby('letters')['x'].transform(np.nanmean)
df['letter x score'] = np.vectorize(scoreFunHigh)(df['x'], letterMeanX, 0.2, 10)
letterMeanY = df.groupby('letters')['y'].transform(np.nanmean)
df['letter y score'] = np.vectorize(scoreFunHigh)(df['y'], letterMeanY, 0.3, 5)
这很有效。但是,我得到以下运行时警告:
C:\Users\\Python\Python38\lib\site packages\numpy\lib\function\u base.py:2167:RuntimeWarning:在中遇到无效值?(矢量化) 输出=ufunc(*输入)
(请注意,如果我运行与上面完全相同的代码,我不会得到错误。我的实际数据帧要大得多,并且我对不同的数据使用了多个函数)
这里有什么问题?有没有更好的方法来设置这个
多谢各位
这里的版本不使用
np.vectorize
输出
您提供的示例不会生成runtimewarning,因此我们无法帮助您诊断它。我不知道更全面的追踪是否能提供有用的信息
但让我们看看计算结果:
对于df任务:
通常
np.vectorize
由于otypes
问题而产生问题(阅读文档);如果试算生成一个整数,那么返回的数据类型将设置为该整数,如果其他值为浮点值,则会出现问题。但是在这种情况下,结果只能有三个值中的一个,[-10,0,10](最后一个参数)您提供的警告表明,较大数据帧中的某些值对于
scoreFunHigh
函数中的计算是错误的。但是警告没有给出足够的细节来说明什么对这个问题应用实numpy向量化相对容易,因为它依赖于两个系列,
df['x]
和letterMeanX
和2个标量换句话说,它不是逐行应用上/下比较,而是将其应用于整个系列。它仍在迭代,但在编译的numpy方法中,速度要快得多
np.vectorize
只是迭代的包装。它仍然为每一行调用一次python函数。希望性能免责声明足够清楚相关问题 更多 >
编程相关推荐