使用groupby方法对嵌套迭代进行矢量化

2024-04-26 00:05:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经编写了代码来遍历一个具有分界列的数据集。此列由所有同等取消标记的行共享的值组成。代码使用嵌套循环遍历每个划分的部分,以遍历每一行,在其各自的划分块中查找每一行的最近邻居

import pandas as pd
import numpy as np

使用XYZ和Section demark创建df

p=5
df = pd.DataFrame(np.random.randn(100, 3), columns=list('XYZ'))
df2 = df.sort('Z')
df2 = df2.reset_index(drop=True)
df2['Section_demark'] = (df2.index/p).astype('int')


df2.head(15)
      X         Y         Z            Section_demark
0    -1.125526 -0.249091 -2.505444     0 
1    0.710114   1.357477 -2.195904     0 
2   -0.580319  -0.997311 -2.031280     0 
3    1.311526  -0.268590 -1.741079     0 
4    0.481450   0.448904 -1.546278     0 
5   -1.820224  -0.846628 -1.392700     1 
6    0.528618   0.418862 -1.388170     1 
7    0.360560  -0.309429 -1.319548     1 
8   -0.369107  -1.290528 -1.233815     1 
9    0.139063   0.045076 -1.209820     1 
10   0.049387   1.087300 -1.188375     2 
11   0.678247  -1.191882 -1.172214     2 
12  -0.976294  -0.752081 -1.092286     2 
13   0.875952   0.319304 -1.079185     2 
14   0.469730  -0.329548 -1.044178     2 

欧氏距离函数

def eucl_d(item_id):
    a = df3.sub(df3.iloc[item_id], axis=1)
    b = np.sum( np.square(a), axis=1 )
    return b

遍历demarks段,遍历每个demark段中的行并查找最近的邻居, 隔离最靠近最上面一行的行并创建一个系列,获取该系列的ix并从中编译一个列表。 将列表读回df2,创建一个以最近邻索引号为值的新列

s=0
elements = []
while s<(len(df2)/p):
    df3 = df2[df2['Section_demark']==(s)]
    r=0
    while r<(p):   
        df4=df3.copy()
        df4['dist'] = eucl_d(r)
        df4 = df4.sort('dist')
        ser = df4.iloc[1]
        elements.append(ser.name)
        r=r+1
    s=s+1
df2["NNIX"] = elements

df2.head(10)

     X1       Y1        Z1        NNIX
0    0.002299 1.284195 -1.604009   1 
1   -0.444305 0.346856 -2.396538   0 
2   -0.490741 -1.416682 -1.423573  3 
3    0.203635 -0.676841 -1.596332  2 
4    0.002299 1.284195 -1.604009   1 
5   -0.314330 0.036554 -1.153127   6 
6   -0.387839 0.129000 -1.235331   5 
7   -0.314330 0.036554 -1.153127   6 
8   -0.059477 -0.205260 -1.136376  7 
9   0.717980 0.130665 -1.040372    8 

我想用groupby命令来交换迭代的最后一部分,并使用aggregate或apply来运行eucl\d函数,但我没有找到它

我可以通过运行以下命令将df2分组:

grouped = df3.groupby('Section_demark')

这是给我带来麻烦的第二步 我在想:

grouped.agg(eucl_d(item_id))

但是我不知道如何为eucl\d(item\u id)指定item\u id


Tags: 代码importiddfasnpsectionelements