我要問的可能不是計算效率/便宜。
基本上我想要做的是從我的 pandas DataFrame 中隨機選擇一行,然后修改原始 DataFrame 以便該行基本上從資料框中“彈出”。
到目前為止,我嘗試的是對 DataFrame 進行轉置,然后在我要洗掉的“列”上應用 pop()。列的索引由亂數選擇。
import pandas as pd
from random import randrange
df = pd.DataFrame(np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]),
columns=['a', 'b', 'c'])
df_t = df.T
random_index = randrange(len(df_t))
popped = df_t.pop(random_index)
df = df_t.T
雖然這適用于這個小資料框,但我不確定它是否能很好地擴展到我打算使用的資料框。對于背景關系,我正在使用 30-50k 行的 pandas 資料框。我需要重復執行此程序,直到行或多或少用盡。
有沒有一種計算效率更高的方法來執行我正在嘗試做的事情?
uj5u.com熱心網友回復:
IIUC,您想從資料框中隨機選擇一行并將其洗掉。
本質上,我們使用numpy's random seed在可用索引范圍內選擇一個索引,然后洗掉我們關心的索引。
您可以使用以下示例來執行此操作(參考)
import numpy as np, pandas as pd
np.random.seed(8)
remove_n = 2
df = pd.DataFrame({"a":[1,2,3,4,5], "b":[6,7,8,9,10]})
idx_to_drop = np.random.choice(df.index, remove_n, replace=False)
# In place
df.drop(idx_to_drop, inplace=True, axis=0)
print(df)
# res = df.drop(idx_to_drop)
uj5u.com熱心網友回復:
您可以使用drop:
popped = df.iloc[random_index]
df.drop(random_index, inplace=True)
輸出:
>>> random_index
0
>>> popped
a 1
b 2
c 3
Name: 0, dtype: int64
>>> df
a b c
1 4 5 6
2 7 8 9
uj5u.com熱心網友回復:
您可以使用 sklearn 的shuffle:
from sklearn.utils import shuffle
df2 = shuffle(df)
這將隨機打亂資料幀中的所有行,因此您可以回圈遍歷這些行以執行您打算執行的操作(并且它們將被隨機排序),或者保留打亂的資料幀并繼續執行您的代碼。
使用此方法意味著您無需從初始資料框中洗掉行。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/461326.html
上一篇:如何根據列值獲取資料框的子集?
