繁体   English   中英

我可以使用lambda,map,apply或applymap来填充数据帧吗?

[英]Can I use lambda, map, apply, or applymap to fill a dataframe?

这是我数据的简化版本。 我有一个坐标数据框和一个空数据框,应使用提供的函数填充每对的距离。

填充此数据帧的最快方法是什么? 尽可能地,我想远离嵌套for循环(慢!)。 我可以使用apply或applymap吗? 您可以相应地修改功能或其他部分。 谢谢。

import pandas as pd

def get_distance(point1, point2):
    """Gets the coordinates of two points as two lists, and outputs their distance"""
    return (((point1[0] - point2[0]) ** 2 + (point1[1] - point2[1]) ** 2 + (point1[2] - point2[2]) ** 2) ** 0.5)

#Dataframe of coordinates.    
df = pd.DataFrame({"No.": [25, 36, 70, 95, 112, 101, 121, 201], "x": [1,2,3,4,2,3,4,5], "y": [2,3,4,5,3,4,5,6], "z": [3,4,5,6,4,5,6,7]})
df.set_index("No.", inplace = True)

#Dataframe to be filled with each pair distance.
df_dist = pd.DataFrame({'target': [112, 101, 121, 201]}, columns=["target", 25, 36, 70, 95])
df_dist.set_index("target", inplace = True)

如果您不想使用for循环,则可以通过以下方式计算所有可能对之间的距离。

你首先需要自己做df的笛卡尔积,得到所有可能的点对。

i, j = np.where(1 - np.eye(len(df)))
df=df.iloc[i].reset_index(drop=True).join(
    df.iloc[j].reset_index(drop=True), rsuffix='_2')

其中ij是大小为len(df)方阵的上下三角形的布尔索引。 完成此操作后,您只需应用距离函数即可

df['distance'] = get_distance([df['x'],df['y'],df['z']], [df['x_2'],df['y_2'],df['z_2']])
df.head()

No. x   y   z   No._2   x_2 y_2 z_2 distance
0   25  1   2   3   36  2   3   4   1.732051
1   25  1   2   3   70  3   4   5   3.464102
2   25  1   2   3   95  4   5   6   5.196152
3   25  1   2   3   112 2   3   4   1.732051
4   25  1   2   3   101 3   4   5   3.464102

如果你只想计算df_dist中的点,你可以相应地修改矩阵1 - np.eye(len(df))

AFAIK对于for循环没有明确的lambda速度优势 - 并且编写双lambda非常困难,通常是为简单的行操作保留的。

但是通过一些工程,我们可以将代码简化为一些简单明了的解释:

import numpy as np

get = lambda i: df.loc[i,:].values
dist = lambda i, j: np.sqrt(sum((get(i) - get(j))**2))
# Fills your df_dist
for i in df_dist.columns:
    for j in df_dist.index:
        df_dist.loc[j,i] = dist(i, j)

由此产生的df_dist

              25        36        70        95
target                                        
112     1.732051  0.000000  1.732051  3.464102
101     3.464102  1.732051  0.000000  1.732051
121     5.196152  3.464102  1.732051  0.000000
201     6.928203  5.196152  3.464102  1.732051

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM