我正在尝试使用基于单元格的中间数据帧(matrix_df)中的数据将输入数据帧(inp_df)转换为输出数据帧(out_df),如下所示。
有几个基于单元格编号的文件,其距离值显示在matrix_df中。
该程序按细胞和细胞进行迭代。从适当的文件中提取数据,因此每次matrix_df将包含我们在inp_df中迭代的当前单元格#的所有行的数据。
inp_df
A B cell
100 200 1
115 270 1
145 255 2
115 266 1
matrix_df (cell_1.csv)
B 100 115 199 avg_distance
200 7.5 80.7 67.8 52
270 6.8 53 92 50
266 58 84 31 57
matrix_df (cell_2.csv)
B 145 121 166 avg_distance
255 74.9 77.53 8 53.47
out_df dataframe
A B cell distance avg_distance
100 200 1 7.5 52
115 270 1 53 50
145 255 2 74.9 53.47
115 266 1 84 57
我对每个基于单元格的数据的当前思考过程是
但我正在寻找一种pandonic方式来做这件事,因为当输入中有数百万行时,我的方法会变慢。我特意在迭代中寻找核心逻辑来获取匹配,因为在每个单元格中,matrix_df中的列数会有所不同
如果有任何帮助,矩阵文件是来自sklearn.metrics.pairwise.pairwise_distances的基于距离的输出。
NB:在inp_df中,列B的值是唯一的,列A的值可能是唯一的也可能不是唯一的
matrix_dfs第一列也是空的&我已经使用以下代码重命名它以便于理解,因为它是一个无标题的矩阵输出文件。
dist_df = pd.read_csv(mypath,index_col=False)
dist_df.rename(columns={'Unnamed: 0':'B'}, inplace=True)
答案 0 :(得分:1)
第1步:将您的输入与pd.concat
连接,并使用inp_df
与df.merge
合并
In [641]: out_df = pd.concat([matrix_df1, matrix_df2]).merge(inp_df)
第2步:使用distance
的值索引到正确的列中,使用df.apply
创建A
列
In [642]: out_df.assign(distance=out_df.apply(lambda x: x[str(int(x['A']))], axis=1))\
[['A', 'B', 'cell', 'distance', 'avg_distance']]
Out[642]:
A B cell distance avg_distance
0 100 200 1 7.5 52.00
1 115 270 1 53.0 50.00
2 115 266 1 84.0 57.00
3 145 255 2 74.9 53.47