使用pandas中其他列的每个单元格对一列的每个单元格执行操作

时间:2016-10-04 12:50:10

标签: python pandas dataframe

我有一个包含1000多列的数据框(df)。每个单元格都包含一个列表。 e.g。

           0            1             2  .... n
0    [1,2,3]      [3,7,9]       [1,2,1]  ....[x,y,z]
1    [2,5,6]      [2,3,1]       [3,3,3]  ....[x1,y1,z1]
2       None      [2,0,1]       [2,2,2]  ....[x2,y2,z2]
3       None      [9,5,9]          None  ....None

此列表实际上是尺寸。我需要找到第0列中每个单元格与第1列中每个其他单元格的欧氏距离并存储最小值。 类似地,从第0列到第2列再到第3列,依此类推..

实施例

distance of df[0][0] from df[1][0], df[1][1], df[1][2]
then of df[0][1] from df[1][0], df[1][1], df[1][2] and so on...

目前我在for循环的帮助下这样做,但它需要花费大量时间来处理大数据。 以下是实现::

for n in range(len(df.columns)):
    for m in range(n+1,len(df.columns)):
        for q in range(df.shape[0]):
            min1=9999
            r=0
            while(r<df.shape[0]):
                if(df[n][q] is not None or df[m][r] is not None):
                    dist=distance.euclidean(df[n][q],df[m][r])
                    if(d<min1):
                            min1=d
                    if(min1==0):  *#because distance can never be less than zero*
                        break
                    r=r+1

还有其他办法吗?

2 个答案:

答案 0 :(得分:0)

您可以使用pandas apply。下面的示例将执行0到1之间的距离并创建一个新列。

import pandas as pd
import numpy as np

df = pd.DataFrame({'0':[[1,2,3],[2,5,6]],'1':[[3,7,9],[2,3,1]]})

def eucledian(row):
    x = np.sqrt((row[0][0]-row[1][0])**2)
    y = np.sqrt((row[0][1]-row[1][1])**2)
    z = np.sqrt((row[0][2]-row[1][2])**2)
    return [x,y,z]

df['dist0-1'] = df.apply(eucledian,axis=1)

有了这个说法,我强烈建议您将变量展开到单独的列,例如0.x,0.y,0.z等然后使用numpy直接在列上操作。如果您有大量数据,这将会快得多。

答案 1 :(得分:0)

既然你没有告诉我如何在距离计算中处理Nond,我只举一个例子。您需要自己处理None类型的异常。

import pandas as pd
import numpy as np
from scipy.spatial.distance import pdist

df = pd.DataFrame([{'a':[1,2,3], 'b':[3,7,9], 'c':[1,2,1]},
                   {'a':[2,5,6], 'b':[2,3,1], 'c':[3,3,3]}])
df.apply(distance, axis=1).apply(min, axis=1)