資料框df:
no列具有單個 int 值 1-28 按遞增順序,直到下一組開始(資料幀已預先排序)。缺少某些值(例如 1,2,3,5,7,1,2,3,28,1 ...)intensity列有一個浮點值 0.0-1.0。target有一個索引為 0-27 的 numpy 陣列,它應該包含該組的所有強度。沒有 1 的強度應該在這個 numpy 陣列的第 0 個索引處,沒有 2 的強度應該在第 1 個,依此類推。這個陣列一開始用 0.0 填充
| 指數 | 不 | 強度 | 目標 |
|---|---|---|---|
| 0 | 2 | 0.027350 | np.arange(0,27) |
| 1 | 4 | 0.074639 | np.arange(0,27) |
| 2 | 5 | 0.056452 | np.arange(0,27) |
| 3 | 2 | 0.011223 | np.arange(0,27) |
結果應該是:
假設我們看第 x 行:在這一行中,列的 numpy 陣列df['target']應該被重寫,以便在它的位置(df['no']-1)[x]0.0 值應該被重寫為df['intensity'][x]值,
例如 ifdf['no'][0] = 2和df['intensity'][0] = 0.027350then
df['target'][0] = [0.0, 0.027350, 0.0 ... ]
如果在這個組中沒有這樣的no值,強度應該保持 0.0
target上例表中的列應如下所示:
array([[0.0, 0.027350, 0.0, 0.074639, 0.056452, 0.0(在索引 5-27)],[0.0, 0.011223, ...]])
我使用 for 回圈得到了這個結果
for i in df.index:
df['target'][i][(df['no'][i])-1] = df['intensity'][i]
if i >= df.index.max():
break
if df['no'][i] < df['no'][i 1]:
df['target'][i 1] = df['target'][i] df['target'][i 1]
df.drop(i, inplace=True)
不過它太慢了,因為我有數百萬行。有沒有辦法使用 .apply() 函式或其他任何方法來加快行程?
uj5u.com熱心網友回復:
您不需要額外的強度列并逐行修改。您可以為每個組執行一項操作:
df['group'] = (df['no'].shift(1) > df['no']).cumsum()
def map_intensity(arr):
new_arr = np.zeros(27)
new_arr[arr['no'].values] = arr['intensity'].values
return new_arr
df.groupby('group').apply(map_intensity)
uj5u.com熱心網友回復:
# Label your groups:
df['groups'] = df.no.lt(df.no.shift()).cumsum()
# Create a multi-index of your groups and desired range:
mux = pd.MultiIndex.from_product([df['groups'].unique(), np.arange(1,29)], names=('groups','no'))
out = (df.set_index(['groups', 'no']) # Match this new index,
.reindex(mux, fill_value=0) # Reindex with it (Filling with 0's!)
.groupby(level=-2)['intensity'] # Groupby 'groups', taking intensity
.apply(np.array)) # Make them into numpy arrays.
print(out)
輸出:
groups
0 [0.0, 0.02735, 0.0, 0.074639, 0.056452, 0.0, 0...
1 [0.0, 0.011223, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...
Name: intensity, dtype: object
現在,如果我們希望每一行都有這個:
df = df.set_index('groups')
df['target'] = out
df = df.reset_index(drop=True)
print(df)
輸出:
no intensity target
0 2 0.027350 [0.0, 0.02735, 0.0, 0.074639, 0.056452, 0.0, 0...
1 4 0.074639 [0.0, 0.02735, 0.0, 0.074639, 0.056452, 0.0, 0...
2 5 0.056452 [0.0, 0.02735, 0.0, 0.074639, 0.056452, 0.0, 0...
3 2 0.011223 [0.0, 0.011223, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/516181.html
上一篇:如何將陣列的元組轉換為整數的元組
