形成个人组python(pandas)

时间:2018-04-22 17:37:56

标签: python python-2.7 pandas data-manipulation

我有以下格式的数据集:

import pandas as pd
d1 = {'Subject': ['Subject1','Subject1','Subject1','Subject2','Subject2','Subject2','Subject3','Subject3','Subject3','Subject4','Subject4','Subject4'],
'Event':['1','2','3','1','2','3','1','2','3','1','2','3'],
'Category':['1','1','2','2','1','2','2','','2','1','1',''],
'Variable1':['1','2','3','4','5','6','7','8','9','10','11','12'],
'Variable2':['12','11','10','9','8','7','6','5','4','3','2','1'],
'Variable3': ['-6','-5','-4','-3','-4','-3','-2','-1','0','1','2','3']}
d1 = pd.DataFrame(d1)
d1=d1[['Subject','Event','Category','Variable1','Variable2','Variable3']]
d1

这看起来如下:

enter image description here

凡是 1)'主题'是主题级别标识符。
2)'事件'是事件级别标识符。
3)'类别'是类别级别标识符。
4)Variable1,Variable2& Variable3是每个主题的一些连续变量。

我需要为'主题'制作所有可行的2 组。对于'事件'对于每个类别'。

例如,对于事件1,唯一可能的对是: 1)主题1 - 主题4(对于第1类) 2)主题2 - 主题3(对于第2类)

请注意,如果缺少某个类别值,则表示该主题为'被认为没有参加此次活动。

在形成每个可能的组后,我必须将变量1,变量2和变量3用于“主题”和“主题”。把它们并排放在一起。

这应该如下所示:

enter image description here

重要的是维持'主题'出现在Match1和Match2列下以及Variable1,Variable2,Variable3列的排序。

活动2的可能配对如下所示:

请注意,对于Subject3,类别为空,她不会出现在配对中。

enter image description here

同样,事件3的可能配对如下所示: 请注意,因为对于Subject4,类别为空,她不会出现在配对中。

enter image description here

决赛桌如下:

enter image description here

请注意,所有数字都是随机的。在实际数据集中,我有大约15个类别,每个类别包含跨越300个事件的大约1000个主题。在某些情况下,某些类别可能没有对事件进行观察,如此处所示。

如果您的问题不是很清楚,或者我在这里的配对示例中犯了错误,请告诉我。

任何帮助将不胜感激。提前谢谢。

1 个答案:

答案 0 :(得分:1)

使用:

from  itertools import combinations

d1['Category'] = d1['Category'].mask(d1['Category'] == '')

L = [(i[0], i[1], y[0], y[1]) for i, x in d1.groupby(['Event','Category'])['Subject'] 
                              for y in list(combinations(x, 2))]
df = pd.DataFrame(L, columns=['Event','Category','Match1','Match2'])

df1 = (df.rename(columns={'Match1':'Subject'})
         .merge(d1, on=['Event','Category','Subject'], how='left')
         .iloc[:, 4:]
         .add_suffix('.1'))
df2 = (df.rename(columns={'Match2':'Subject'})
         .merge(d1, on=['Event','Category','Subject'], how='left')
         .iloc[:, 4:]
         .add_suffix('.2'))

fin = pd.concat([df, df1, df2], axis=1)
print (fin)
  Event Category    Match1    Match2 Variable1.1 Variable2.1 Variable3.1  \
0     1        1  Subject1  Subject4           1          12          -6   
1     1        2  Subject2  Subject3           4           9          -3   
2     2        1  Subject1  Subject2           2          11          -5   
3     2        1  Subject1  Subject4           2          11          -5   
4     2        1  Subject2  Subject4           5           8          -4   
5     3        2  Subject1  Subject2           3          10          -4   
6     3        2  Subject1  Subject3           3          10          -4   
7     3        2  Subject2  Subject3           6           7          -3   

  Variable1.2 Variable2.2 Variable3.2  
0          10           3           1  
1           7           6          -2  
2           5           8          -4  
3          11           2           2  
4          11           2           2  
5           6           7          -3  
6           9           4           0  
7           9           4           0  

<强>解释

  1. mask将空字符串替换为NaN - groupby以静默方式删除这些行
  2. 按列表推导创建DataFrame,并按列2Subject
  3. 按列组EventCategory的所有组合展平
  4. 使用左连接按merge加倍变量列,按iloc按位置过滤掉4列,然后添加add_suffixadd_prefix以避免重复列名称
  5. 最后concat所有3个DataFrame在一起