我有以下格式的数据集:
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
这看起来如下:
凡是
1)'主题'是主题级别标识符。
2)'事件'是事件级别标识符。
3)'类别'是类别级别标识符。
4)Variable1,Variable2& Variable3是每个主题的一些连续变量。
我需要为'主题'制作所有可行的2 组。对于'事件'对于每个类别'。
例如,对于事件1,唯一可能的对是: 1)主题1 - 主题4(对于第1类) 2)主题2 - 主题3(对于第2类)
请注意,如果缺少某个类别值,则表示该主题为'被认为没有参加此次活动。
在形成每个可能的组后,我必须将变量1,变量2和变量3用于“主题”和“主题”。把它们并排放在一起。
这应该如下所示:
重要的是维持'主题'出现在Match1和Match2列下以及Variable1,Variable2,Variable3列的排序。
活动2的可能配对如下所示:
请注意,对于Subject3,类别为空,她不会出现在配对中。
同样,事件3的可能配对如下所示: 请注意,因为对于Subject4,类别为空,她不会出现在配对中。
决赛桌如下:
请注意,所有数字都是随机的。在实际数据集中,我有大约15个类别,每个类别包含跨越300个事件的大约1000个主题。在某些情况下,某些类别可能没有对事件进行观察,如此处所示。
如果您的问题不是很清楚,或者我在这里的配对示例中犯了错误,请告诉我。
任何帮助将不胜感激。提前谢谢。
答案 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
<强>解释强>:
mask
将空字符串替换为NaN - groupby
以静默方式删除这些行DataFrame
,并按列2
和Subject
Event
列Category
的所有组合展平
merge
加倍变量列,按iloc
按位置过滤掉4
列,然后添加add_suffix
或add_prefix
以避免重复列名称concat
所有3个DataFrame在一起