我刚刚加入my first kaggle competition。我有一个这样的表:
| Person_id | Children_id | Person_Photos | Children_Photos |
|-----------|-------------|------------------------------------|------------------------|
| pid1 | cid1 | pid1_0.jpg, pid1_1.jpg, pid1_2.jpg | cid1_0.jpg, cid1_1.jpg |
| pid2 | cid1 | pid2_0.jpg, pid2_1.jpg, pid1_2.jpg | cid1_0.jpg, cid1_1.jpg |
我想为每个Person_Photos和Children_Photos匹配项生成一行。例如:
| Person_id | Children_id | Person_Photo | Children_Photo |
|-----------|-------------|--------------|----------------|
| pid1 | cid1 | pid1_0.jpg | cid1_0.jpg |
| pid1 | cid1 | pid1_0.jpg | cid1_1.jpg |
| pid1 | cid1 | pid1_1.jpg | cid1_0.jpg |
| pid1 | cid1 | pid1_1.jpg | cid1_1.jpg |
| pid1 | cid1 | pid1_2.jpg | cid1_0.jpg |
| pid1 | cid1 | pid1_2.jpg | cid1_1.jpg |
| pid2 | cid1 | pid2_0.jpg | cid1_0.jpg |
| pid2 | cid1 | pid2_0.jpg | cid1_1.jpg |
| pid2 | cid1 | pid2_1.jpg | cid1_0.jpg |
| pid2 | cid1 | pid2_1.jpg | cid1_1.jpg |
| pid2 | cid1 | pid2_2.jpg | cid1_0.jpg |
| pid2 | cid1 | pid2_2.jpg | cid1_1.jpg |
我如何使用熊猫来做到这一点?预先感谢您的任何投入!
答案 0 :(得分:0)
s = pd.DataFrame({'Person_id':['pid1','pid2'],
'Children_id':['cid1','cid1'],
'Person_Photos':["'pid1_0.jpg', 'pid1_1.jpg', 'pid1_2.jpg'","'pid2_0.jpg', 'pid2_1.jpg', 'pid1_2.jpg'"],
'Children_Photos':["'cid1_0.jpg', 'cid1_1.jpg'","'cid1_0.jpg', 'cid1_1.jpg'"]})
one=s.set_index('Person_id').Person_Photos.str.split(',', expand=True).stack().reset_index('Person_id')
one.columns=['Person_id','Person_Photos']
# print(one)
# print('*'*50)
two=s.set_index('Children_id').Children_Photos.str.split(',', expand=True).stack().reset_index('Children_id')
two.columns=['Children_id','Children_Photos']
# print(two)
one['tmp'] = 1
two['tmp'] = 1
pd.merge(one, two, on=['tmp'])
Person_idPerson_Photos tmp Children_id Children_Photos
0 pid1 'pid1_0.jpg' 1 cid1 'cid1_0.jpg'
1 pid1 'pid1_0.jpg' 1 cid1 'cid1_1.jpg'
2 pid1 'pid1_0.jpg' 1 cid1 'cid1_0.jpg'
3 pid1 'pid1_0.jpg' 1 cid1 'cid1_1.jpg'
4 pid1 'pid1_1.jpg' 1 cid1 'cid1_0.jpg'
5 pid1 'pid1_1.jpg' 1 cid1 'cid1_1.jpg'
6 pid1 'pid1_1.jpg' 1 cid1 'cid1_0.jpg'
7 pid1 'pid1_1.jpg' 1 cid1 'cid1_1.jpg'
8 pid1 'pid1_2.jpg' 1 cid1 'cid1_0.jpg'
9 pid1 'pid1_2.jpg' 1 cid1 'cid1_1.jpg'
10 pid1 'pid1_2.jpg' 1 cid1 'cid1_0.jpg'
11 pid1 'pid1_2.jpg' 1 cid1 'cid1_1.jpg'
12 pid2 'pid2_0.jpg' 1 cid1 'cid1_0.jpg'
13 pid2 'pid2_0.jpg' 1 cid1 'cid1_1.jpg'
14 pid2 'pid2_0.jpg' 1 cid1 'cid1_0.jpg'
15 pid2 'pid2_0.jpg' 1 cid1 'cid1_1.jpg'
16 pid2 'pid2_1.jpg' 1 cid1 'cid1_0.jpg'
17 pid2 'pid2_1.jpg' 1 cid1 'cid1_1.jpg'
18 pid2 'pid2_1.jpg' 1 cid1 'cid1_0.jpg'
19 pid2 'pid2_1.jpg' 1 cid1 'cid1_1.jpg'
20 pid2 'pid1_2.jpg' 1 cid1 'cid1_0.jpg'
21 pid2 'pid1_2.jpg' 1 cid1 'cid1_1.jpg'
22 pid2 'pid1_2.jpg' 1 cid1 'cid1_0.jpg'
23 pid2 'pid1_2.jpg' 1 cid1 'cid1_1.jpg'
答案 1 :(得分:0)
您可以两次申请Series
:
one = df.apply(lambda x: pd.Series(x['Person_Photos']), axis=1).stack().reset_index(level=1, drop=True)
df = df.drop('Person_Photos', axis=1)
one.name = 'Person_Photos'
df = df.join(one)
two = df.apply(lambda x: pd.Series(x['Children_Photos']), axis=1).stack().reset_index(level=1, drop=True)
df = df.drop('Children_Photos', axis=1)
two.name = 'Children_Photos'
df = df.join(two)