按两列中的值生成行

时间:2019-05-15 08:58:59

标签: python pandas

我刚刚加入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     |

我如何使用熊猫来做到这一点?预先感谢您的任何投入!

2 个答案:

答案 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)