我遇到了一個需求,我需要將列中的專案串列與其他列的值連接起來,如下所示。
輸入:
ColumnA ColumnB
0 [x, y, z] 失敗
1 [x, y] Passed(通過)。
輸出:
ColumnA ColumnB ColumnC
0 [x, y, z] Failed [x:Failed, y:Failed, z:Failed] 。
1 [x, y] Passed (x:Passed, y:Passed)
有人能讓我知道我如何使用python和pandas實作這個目標嗎?
uj5u.com熱心網友回復:
如果只使用pandas,你可以explode,連接,并轉換為串列:
df['ColumnC'] = (df.explode('ColumnA')
.assign(ColumnC=lambda d: d['ColumnA'] ' :' d['ColumnB']
.groupby(level=0)['ColumnC'].apply(list)
)
一個更快的解決方案是使用itertools.product:
from itertools import product
df['ColumnC'] = df.apply(lambda r: list(map(': '. join, product(r['ColumnA'], [r['ColumnB'])), axis=1)
輸出:
ColumnA ColumnB ColumnC
0 [x, y, z] Failed [x:Failed, y:Failed, z:Failed] 。
1 [x, y] Passed (x:Passed, y:Passed)
uj5u.com熱心網友回復:
使用嵌套的串列理解與f-strings在性能上很重要:
df = pd. DataFrame({"ColumnA"/span>: [list('xyz'), list('xy')] 。
"ColumnB": ['Failed', ' Passed']})
df['ColumnC'] = [[f'{z}: {y}' for z in x ] for x, y in df[['ColumnA', 'ColumnB']].to_numpy()]
print (df)
欄目A 欄目B 欄目C
0 [x, y, z] Failed [x:Failed, y:Failed, z:Failed] 。
1 [x, y] Passed (x:Passed, y:Passed)
另一個想法,更慢的是使用apply:
df['ColumnC'] = df.apply(lambda x: [f'{z}: {x["ColumnB"]}' for z in x['ColumnA'] ] 。axis=1)
最慢的是使用explode和groupby。
#test for 20k rows.
df = pd.concat([df] * 10000, ignore_index=True)
在[29]: %timeit (df.explode('ColumnA')。 assign(ColumnC=lambda d: d['ColumnA'] ' :' d['ColumnB'])。 groupby(level=0)['ColumnC'].apply(list)
600 ms ± 10 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
在[34]: %timeit df.apply(lambda r: list(map(' :'. join, product(r['ColumnA'], [r['ColumnB'])), axis=1)
268 ms ± 3.9 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
在[30]: %timeit [[f'{z}: {y}' for z in x] 。for x, y in df[['ColumnA', 'ColumnB']].to_numpy()]
36.4 ms ± 894 μs per loop (mean ± std. dev. of 7 runs, 10 loops each)
在 [31]: %timeit df.apply(lambda x: [f'{z}: {x["ColumnB"]}' for z in x['ColumnA'] ] 。axis=1)
363 ms ± 2.08 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/307649.html
標籤:
