所以我有一個看起來像這樣的資料框(D1):
| 身份證 | 姓名 |
|---|---|
| n1 | 莎拉 |
| n2 | 約翰 |
我有另一個資料框(D2),看起來像
| 時間標識 | 作家 | 董事 |
|---|---|---|
| t1 | n1,n4 | n2,n3 |
| t2 | n4 | n3 |
| t3 | n1 | n2。 |
D1 中的 nID 可以在 D2 的作者或導演列中。現在對于每個 nID,我想獲取 nID 在任一列中的所有 tID,并將 tID 串列存盤在 D1 的新列中。
所以最終的 D1 看起來像這樣:
| 身份證 | 姓名。 | 時間。 |
|---|---|---|
| n1 | 薩拉 | t1,t3 |
| n2 | 約翰 | t1,t3 |
使用 Pandas 執行此操作的最有效方法是什么,因為我在 D1 中有大約 30k 行,在 D2 中有 800k 行?將列拆分為多列并進行合并會更好嗎?
uj5u.com熱心網友回復:
explode然后我們可以用 nId melt 來獲取 tIDgroupbydf2
df2['writers'] = df2['writers'].str.split(',')
df2['directors'] = df2['directors'].str.split(',')
s = df2.melt('tID').explode('value').groupby('value')['tID'].agg(','.join)
df1['new'] = df1['nID'].map(s)
df1
Out[221]:
nID name new
0 n1 Sarah t1,t3
1 n2 John t1,t3
uj5u.com熱心網友回復:
好吧,這是一種方法:
d1.merge(
d2.assign(nID=(d2['writers'] d2['directors']).apply(set))
.explode('nID').groupby('nID')['tID'].agg(set),
on='nID', how='left')
這是假設列 'writers' 和 'directors' 已經是 type list。
速度:
np.random.seed(0)
n1 = 3_000
n2 = 80_000
d1 = pd.DataFrame({
'nID': np.arange(n1),
'name': [f'name_{i:06d}' for i in range(n1)],
})
d2 = pd.DataFrame({
'tID': np.arange(n2),
'writers': [
list(np.random.choice(d1.nID, k, replace=False))
for k in np.random.randint(1, min(4, n1) 1, n2)
],
'directors': [
list(np.random.choice(d1.nID, k, replace=False))
for k in np.random.randint(1, min(4, n1) 1, n2)
]
})
%timeit d1.merge(d2.assign(nID=(d2['writers'] d2['directors']).apply(set)).explode('nID').groupby('nID')['tID'].agg(set), on='nID', how='left')
384 ms ± 697 μs per loop (mean ± std. dev. of 7 runs, 1 loop each)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/456679.html
上一篇:如何訪問按季度按頻率分組的groupbygrouper方法的特定結果
下一篇:格式化時間寫成整數和浮點數
