Еще один способ — использовать groupby/cumcount/основной:
import pandas as pd
T1 = pd.DataFrame({'id': [8, 9], 'x': [42, 30], 'y': [1.9, 1.9]})
T2 = pd.DataFrame({'id': [8, 8, 8, 9, 9, 9], 'signal': [55, 56, 59, 57, 58, 60]})
T2['col'] = 's' + T2.groupby(['id'])['signal'].cumcount().astype(str)
T2 = T2.pivot(index='id', columns='col', values='signal').reset_index()
result = pd.merge(T1, T2)
print(result)
урожаи
id x y s0 s1 s2
0 8 42 1.9 55 56 59
1 9 30 1.9 57 58 60
Основная хитрость заключается в том, чтобы использовать groupby/cumcount
для добавления кумулятивного количества для каждой группы в T2:
In [81]: T2['col'] = 's' + T2.groupby(['id'])['signal'].cumcount().astype(str); T2
Out[81]:
id signal col
0 8 55 s0
1 8 56 s1
2 8 59 s2
3 9 57 s0
4 9 58 s1
5 9 60 s2
Затем pivot
можно использовать для преобразования T2
в желаемую форму (или, по крайней мере, близкую к ней):
In [82]: T2 = T2.pivot(index='id', columns='col', values='signal').reset_index(); T2
Out[82]:
col id s0 s1 s2
0 8 55 56 59
1 9 57 58 60
и result
можно получить слиянием:
In [83]: pd.merge(T1, T2)
Out[83]:
id x y s0 s1 s2
0 8 42 1.9 55 56 59
1 9 30 1.9 57 58 60
person
unutbu
schedule
13.06.2016