2017-02-28 103 views
0
import pandas as pd 
df1 = pd.DataFrame({'ID':['i1', 'i2', 'i3'], 
        'A': [2, 3, 1], 
        'B': [1, 1, 2], 
        'C': [2, 1, 0], 
        'D': [3, 1, 2]}) 

df1.set_index('ID') 

df1.head() 


    A B C D 
ID   
i1 2 1 2 3 
i2 3 1 1 1 
i3 1 2 0 2 


df2 = pd.DataFrame({'ID':['i1-i2', 'i1-i3', 'i2-i3'], 
        'A': [2, 1, 1], 
        'B': [1, 1, 1], 
        'C': [1, 0, 0], 
        'D': [1, 1, 1]}) 

df2.set_index('ID') 
df2 

     A B C D 
ID    
i1-i2 2 1 1 1 
i1-i3 1 1 0 1 
i2-i3 1 1 0 1 

给定一个数据帧为df1,像df2这样的新数据帧。 例如,比较i1行和i2行,获得新的行i1-i22, 1, 1, 1 请指教一下是大熊猫做到这一点的最好办法。熊猫:比较每两行并输出结果到一个新的数据帧

回答

1

试试这个:

from itertools import combinations 

v = df1.values 

r = pd.DataFrame([np.minimum(v[t[0]], v[t[1]]) 
        for t in combinations(np.arange(len(df1)), 2)], 
       columns=df1.columns, 
       index=list(combinations(df1.index, 2))) 

结果:

In [72]: r 
Out[72]: 
      A B C D 
(i1, i2) 2 1 1 1 
(i1, i3) 1 1 0 2 
(i2, i3) 1 1 0 1 
+0

它是美丽的方式,使组合。但新的数据帧丢失了ID组合。你能提出一种方法来保持这一点吗? –

+0

@ju。,我已经更新了我的答案 - 请检查 – MaxU