2017-05-26 64 views
0
import pandas as pd 

df = pd.DataFrame({ 'lat' : range(0,8), 
        'name' : ['a', 'a', 'a', 'a', 'b', 'b', 'b', 'b']}) 
df 

輸出是:隨機配對的大熊貓數據幀的所有值

lat name 
0 0 a 
1 1 a 
2 2 a 
3 3 a 
4 4 b 
5 5 b 
6 6 b 
7 7 b 

現在,我想要做的是每個名字類型中,創建隨機配對,並把它們相加。但是,所有行都必須是隨機配對的一部分。

所以理想的輸出會看起來像:

name pairing sum 
0 a 0,3  3 
1 a 2,1  3 
2 b 6,4  10 
3 b 7,5  12 

然而,重要的是,沒有一個公司與B的配對,並且所有值都恰好一對。

我該如何做到這一點?

回答

0

一種選擇是通過名稱創建列作爲一組變量,然後聚合所述結果組:

import pandas as pd 
# use random permutation with modulo division to generate the pair group variable 
def random_pairs(x): 
    return pd.np.random.permutation(pd.np.arange(len(x)))//2 
​ 
df['pair'] = df.groupby('name').lat.transform(random_pairs) 

(df.groupby(['name', 'pair']).lat 
.agg({'pairing': lambda x: ', '.join(x.astype(str)), 'sum': 'sum'}) 
.reset_index('pair', drop=True).reset_index()) 

#name sum pairing 
#0 a 1  0, 1 
#1 a 5  2, 3 
#2 b 9  4, 5 
#3 b 13  6, 7