我有一个包含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
还有其他办法吗?
答案 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)