如何对每行数据帧的值进行排序并返回已排序的列名称

时间:2018-04-06 15:24:11

标签: python pandas dataframe

我有2个不同行的数据帧,dF1 =(1098 x 2列)和 df2 =(1331 x2)例如:

df1

       lat-2    long-2
R1  10.612811   46.265142
R2  10.604078   45.896510
R3  10.610205   45.727291
R4  10.606051   45.772968
R5  10.596646   46.517013

DF2

       lat-1    long-1
G1  10.604065   45.896533
G2  10.612811   46.265142
G3  10.606051   45.772968
G4  10.610205   45.727291
G5  10.606747   44.772287
G6  10.619976   45.847164
G7  10.607682   45.477258
G8  10.784809   44.769609

Get Nearest Point from each other in pandas dataframe的帮助下 我计算df1的每一行与df2的所有行之间的欧几里德距离,因此 new_df 具有(1089 x 1331)。 new_df

            G1          G2         G3          G4           G5        G6           G7             G8
    R1  0.368713    0.000000    0.492220    0.537857    1.492867    0.418039    0.787901    1.505391
    R2  0.000026    0.368735    0.123558    0.169330    1.124226    0.051844    0.419267    1.141302
    R3  0.169353    0.537857    0.045865    0.000000    0.955010    0.120271    0.250046    0.973469
    R4  0.123581    0.492220    0.000000    0.045865    1.000681    0.075491    0.295714    1.019158
    R5  0.620524    0.252389    0.744104    0.789838    1.744755    0.670255    1.039814    1.757506

我想要这样的结果:

                    close
  R1          [G2,G1,G6,G3,G5,G4,G7,G8]
  R2          [G1, G6, ,,......]
  R3          [G4,...]
  R4          [G3,....]
  R5          [G2,G5,...]
  R6          [G2,G3,...]
  R7          [G4,...] 

换句话说,我希望 new_df 的每一行按升序排列列的值,最后返回我想要的结果。

我无法使用Get Nearest Point from each other in pandas dataframe的代码 我试着这样写:

def Closest(df):

    d=defaultdict(list)
    for x in (df.index):

        y=df.loc[str(x)].copy()
        M=y.tolist()

        Q=M.sort_val(ascending=True)
        p=Q.index

        d[x].appand(p)

     return (d)

我的想法是:

h=new_df.loc["R1"].copy()
h:

    G1     0.368713
    G2     0.000000
    G3     0.492220
    G4     0.537857
    G5     1.492867
    G6     0.418039
    G7     0.787901
    G8     1.505391
    Name: R3, dtype: float64

k=h.sort_values(ascending=True)
k.index
d={}
d['R']=k.index

所以我想创建一个字典,其中包含索引R作为键,有序G列表作为值。最后,我可以从这个字典中创建一个数据帧。 但是当我写这个函数发送时("'浮动'对象没有属性' sort_val'",'发生在索引G1')或者'漂浮'对象不可迭代。

我是一名新程序员(初学者),

如何更正我的功能以达到我的目标或 如果我的想法完全错了,我怎么能得到我的结果?

1 个答案:

答案 0 :(得分:0)

您可以为您的df应用rank,然后按照排名顺序对列名称进行排序,并创建一个新的Series

lst=[ [z for z,p in sorted(zip(df.columns.values.tolist(),x),key=lambda y: y[1])] for x in df.apply(lambda x : x.rank(),1).values.tolist()]


pd.Series(data=lst,index=df.index)
Out[1531]: 
R1    [G2, G1, G6, G3, G4, G7, G5, G8]
R2    [G1, G6, G3, G4, G2, G7, G5, G8]
R3    [G4, G3, G6, G1, G7, G2, G5, G8]
R4    [G3, G4, G6, G1, G7, G2, G5, G8]
R5    [G2, G1, G6, G3, G4, G7, G5, G8]
dtype: object