使用pandas

时间:2017-08-02 21:45:55

标签: python pandas dataframe

我正在尝试使用基于单元格的中间数据帧(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

我对每个基于单元格的数据的当前思考过程是

  1. 使用apply函数逐行进行
  2. 然后使用基于inp_df中的列B的连接与matrix_df,其中矩阵df以某种方式被转换为列名称,距离&的元组。平均距离。
  3. 但我正在寻找一种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)​
    

1 个答案:

答案 0 :(得分:1)

第1步:将您的输入与pd.concat连接,并使用inp_dfdf.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