另一種方法是使用groupby/cumcount/pivot:
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
請@ unutbu的解決方案關注 - 它應該是比較快很多礦山 – MaxU