假設我們有四列:Column1、Column2、Column3、ind
import pandas as pd
tbl = {
'Column1':['Spark',10000,'Python','35days'],
'Column2' :[500,'PySpark',22000,30000],
'Column3':['30days','40days','35days','pandas'],
'ind':[1,2,1,3]
}
df = pd.DataFrame(tbl)
有誰知道有沒有辦法添加一個沒有回圈的新列,它將根據存盤在“ind”列中的索引從前 3 列中收集值?
'課程':['Spark','PySpark','Python','pandas']
我嘗試了一些 iloc、lambda 和 apply 的組合,但失敗了。
預期輸出:
Column1 Column2 Column3 ind Course
0 Spark 500 30days 1 Spark
1 10000 PySpark 40days 2 PySpark
2 Python 22000 35days 1 Python
3 35days 30000 pandas 3 pandas
uj5u.com熱心網友回復:
IIUC,你可以試試apply行
df['Course'] = df.apply(lambda row: row.iloc[row['ind']-1], axis=1)
或者你可以試試
df['Course'] = df.values[np.arange(len(df['ind'])), df['ind'].sub(1)]
print(df)
Column1 Column2 Column3 ind Course
0 Spark 500 30days 1 Spark
1 10000 PySpark 40days 2 PySpark
2 Python 22000 35days 1 Python
3 35days 30000 pandas 3 pandas
uj5u.com熱心網友回復:
為了提高效率,請使用索引/列標簽的官方查找:
import numpy as np
idx, cols = pd.factorize('Column' df['ind'].astype(str))
df['Course'] = df.reindex(cols, axis=1).to_numpy()[np.arange(len(df)), idx]
輸出:
Column1 Column2 Column3 ind Course
0 Spark 500 30days 1 Spark
1 10000 PySpark 40days 2 PySpark
2 Python 22000 35days 1 Python
3 35days 30000 pandas 3 pandas
計時
在 40k 行上執行
# lookup (this answer)
25.6 ms ± 2.26 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
# apply
722 ms ± 48.6 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/478858.html
上一篇:使用PythonOS模塊用新資料覆寫現有的txt檔案
下一篇:如何使用特定邏輯對陣列進行排序
