我有一個test形狀為 DataFrame (1138812, 57)。頭部看起來像這樣:

我有一個indices具有 shape的陣列(1138812, 25)。它是一個二維陣列,每個子陣列有 25 個索引。它看起來像這樣:
[
該indices陣列具有來自 DataFrame 的 25 個索引,對應于來自同一 DataFrame 的每個 1138812 個索引。我想基于這個陣列創建一個包含 25 X 1138812 行的新 DataFrame。例如:
我有一個二維陣列,例如:
[[0,2,3],
[1,0,3],
[2,1,0],
[3,1,2]]
我有一個熊貓資料框,例如:
id val
0 a 9
1 b 8
2 c 3
3 d 7
現在我想根據 2d 陣列中列出的索引獲取一個新的資料框,對于這個例子,它會像:
id val id_2 val
0 a 9 a 9
0 a 9 c 3
0 a 9 d 7
1 b 8 b 8
1 b 8 a 9
1 b 9 d 7
2 c 3 c 3
2 c 3 b 8
2 c 3 a 9
3 d 7 d 7
3 d 7 b 8
3 d 7 c 3
我嘗試了很多方法,包括:
import pandas as pd
import numpy as np
index = [[0,2,3],
[1,0,3],
[2,1,0],
[3,1,2]]
idse = ['a','b','c','d']
vals = [9,8,3,7]
data = {'id': idse, 'val': vals}
df = pd.DataFrame(data=data)
newdf = pd.DataFrame(np.repeat(df.values, len(index[0]), axis=0))
flat_list = [item for sublist in index for item in sublist]
newdf['id_2'] = df.id[flat_list].values
newdf['val_2'] = df.val[flat_list].values
和
fdf = pd.DataFrame()
for i, ir in enumerate(l):
temp_df = df.iloc[ir]
temp_df['id'] = df.iloc[i]['id']
temp_df = pd.merge(df,temp_df,how="outer",on="id")
temp_df = temp_df[temp_df['id']==df.iloc[i]['id']]
fdf = pd.concat([fdf,temp_df])
fdf
它們都按照我想要的方式作業,但是對于具有 1.1m 行的原始 DataFrame,它們非常慢,并且它們占用了所有導致筆記本崩潰的記憶體。我正在使用 RAPIDS 庫,包括分別對應于 pandas、numpy/scipy 和 sklearn 的 cuDF、cuPy、cuML,我需要一個純 numpy/pandas 解決方案,以便他們可以使用 GPU 內核并使此操作更快更高效。
謝謝
uj5u.com熱心網友回復:
假設輸入資料幀df和a陣列,您可以使用從扁平陣列索引的資料幀索引repeat資料幀及其索引:concat
idx = df.index.repeat(a.shape[1])
df2 = pd.concat(
[df.loc[idx],
df.loc[a.ravel()].add_suffix('_2').set_axis(idx)
], axis=1)
輸出:
id val id_2 val_2
0 a 9 a 9
0 a 9 c 3
0 a 9 d 7
1 b 8 b 8
1 b 8 a 9
1 b 8 d 7
2 c 3 c 3
2 c 3 b 8
2 c 3 a 9
3 d 7 d 7
3 d 7 b 8
3 d 7 c 3
使用的輸入:
df = pd.DataFrame({'id': ['a', 'b', 'c', 'd'],
'val': [9, 8, 3, 7]})
a = np.array([[0,2,3],
[1,0,3],
[2,1,0],
[3,1,2]])
注意。快速測驗顯示處理 1M 行需要 900 毫秒
uj5u.com熱心網友回復:
讓我們嘗試assign一下explodejoin
out = df.assign(new=a.tolist()).explode('new').set_index('new').add_suffix('_2').join(df)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/461726.html
上一篇:獲取帶有引數的np陣列的一部分
下一篇:從位元組加載numpy中的npz
