优化熊猫代码:替换' iterrows'和其他想法

时间:2017-10-13 12:39:22

标签: python pandas optimization

我是熊猫新手。我写了一个我想优化的代码,但我不确定如何。我知道这两个事实都适用于'和pandas vectoriztion比'iterrows'更快,但不知道如何使用它们来实现相同的目标。 iterrows对我来说很容易,因为它类似于' for'循环,所以我已经习惯了。 这是我的代码:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.metrics import mean_squared_error
from scipy.spatial.distance import euclidean
data = pd.read_csv(r'C:\temp\train.txt')

def group_df(df,num):
    ln = len(df)
    rang = np.arange(ln)
    splt = np.array_split(rang,num)
    lst = []
    finel_lst = []
    for i,x in enumerate(splt):
        lst.append([i for x in range(len(x))])
    for k in lst:
        for j in k:
            finel_lst.append(j)
    df['group'] = finel_lst
    return df
def KNN(dafra,folds,K,fi,target):        
    df = group_df(dafra,folds)
    avarge_e = []
    for i in range(folds):
        train = pd.DataFrame(df.loc[df['group'] != i])
        test = pd.DataFrame(df.loc[df['group'] == i])
        test.loc[:,'pred_price'] = np.nan
        test.loc[:,'rmse'] = np.nan
        train.loc[:,'dis'] = np.nan
        train = train.reset_index()
        test = test.reset_index()
        for index,row in test.iterrows():
            for index2,row2 in train.iterrows():
                train.loc[index2]['dis'] = euclidean(row2[fi],row[fi])

正如您所看到的,有2个嵌套' iterrows'循环。还有一个小的' for'循环在顶部。 这段代码的想法是将每行测试之间的欧氏距离分配给每列火车。但是,由于' for'循环,它最终会加起来所有的原始DataFrame。

以下是数据的开始:

   Id  MSSubClass MSZoning  LotFrontage  LotArea Street Alley LotShape  \
0   1          60       RL         65.0     8450   Pave   NaN      Reg   
1   2          20       RL         80.0     9600   Pave   NaN      Reg   
2   3          60       RL         68.0    11250   Pave   NaN      IR1   

  LandContour Utilities    ...     PoolArea PoolQC Fence MiscFeature MiscVal  
\
0         Lvl    AllPub    ...            0    NaN   NaN         NaN       0   

1         Lvl    AllPub    ...            0    NaN   NaN         NaN       0   

2         Lvl    AllPub    ...            0    NaN   NaN         NaN       0   

  MoSold YrSold  SaleType  SaleCondition  SalePrice  
0      2   2008        WD         Normal     208500  
1      5   2007        WD         Normal     181500  
2      9   2008        WD         Normal     223500  

[3行x 81列]

欢迎任何关于优化此代码的想法。谢谢。

1 个答案:

答案 0 :(得分:0)

我建议您解决两个问题的可能方法:

- 使用scipys distance_matrix

- 写你自己的numpy功能

scipy解决方案是直截了当的:

ionViewWillLeave() {
  document
  .getElementById('container')
  .appendChild(document.getElementById('windyty'));
}

在numpy中我们可以使用外部ufunc来编写我们自己的函数。 np.subtract.outer将从两个类似于外部点积的向量中给出一个矩阵给出乘法。

<ion-app>

时序:

document.getElementById

编辑: 要保留原始索引,可以将源df的索引传递给新数据帧:

import scipy
import numpy as np

point_vector_1 = np.random.random((10000,2))
point_vector_2 = np.random.random((1000,2))
distance_matrix = scipy.spatial.distance_matrix(point_vector_1, point_vector_2)