当我使用数据帧时,有更好的方法来编写这样的循环吗?

时间:2018-02-28 09:12:46

标签: python pandas dataframe

使用数据帧时是否有更好的方法来编写这样的循环? a,b是数据帧(4,1096)

c = pd.DataFrame(np.zeros((4, 1096))) 
for j in range(0, 4):
    for i in range(0, 1096):
         c[i][j]=abs((a[i][j]-b[i][j]))/(a[i][j]+b[i][j])

2 个答案:

答案 0 :(得分:4)

我认为你可以这样做:

c = pd.DataFrame(abs((a.values-b.values)/(a.values+b.values)))

答案 1 :(得分:0)

您可以对pandas数据帧执行算术运算,并且pandas将尝试自动匹配索引(即将具有相同标签的列/行汇总在一起,否则为NaN)。如果您想要更好地控制缺失数据的处理,可以查看addsub方法(doc1doc2)。

我认为在您的情况下ab是两个标记相同的数据框。

所以你可以这样做:

c = ((a - b) / (a + b)).abs()

至于您对DataFrame不同行的评论,您可以使用shift创建一个DataFrame b,以便' b [i,:]' = a [i + 1,:],然后重复上述操作:

c = ((a - a.shift(-1)) / (a + a.shift(-1))).abs()

您可以轻松地将其概括为不同的班次。

pandas最好的功能之一就是索引对齐,所以我建议避免使用pandas中的循环,因为它们非常低效,并且在某种程度上有点失败了拥有pandas DataFrame的目的。

如果您需要非常具体的循环结构,也许您最好使用numpy。