避免多次計算子數據幀df[df['D'] == i]
。原始代碼計算這個len(myunique)**2
次。相反,您可以爲每個i
(即總共len(myunique)
次)計算一次,存儲結果,然後再將它們組合在一起。例如,
groups = [grp for di, grp in df.groupby('D')]
for itemp, jtemp in IT.product(groups, repeat=2):
pass
import pandas as pd
import itertools as IT
df = pd.DataFrame(np.random.randint(0,1000,size=(1000, 4)), columns=list('ABCD'))
def using_orig():
myunique = df['D'].unique()
for i in myunique:
itemp = df[df['D'] == i]
for j in myunique:
jtemp = df[df['D'] == j]
def using_groupby():
groups = [grp for di, grp in df.groupby('D')]
for itemp, jtemp in IT.product(groups, repeat=2):
pass
In [28]: %timeit using_groupby()
10 loops, best of 3: 63.8 ms per loop
In [31]: %timeit using_orig()
1 loop, best of 3: 2min 22s per loop
關於評論:
我可以很容易地更換ITEMP和其中a = 1或打印「jtemp你好「所以無視
上面的答案解決了如何更有效地計算itemp
和jtemp
。如果itemp
和jtemp
對您的實際計算不重要,那麼我們需要更好地理解您真正想要計算的內容以便建議(如果可能)更快地計算它的方法。
嘗試總是以提供[最小,完整的,並且可驗證示例](http://stackoverflow.com/help/mcve)當提問時。如果出現_pandas_問題,請提供樣本_input_和_output_數據集(CSV/dict/JSON/Python代碼格式中的5-7行_s text_,因此可以在爲您編寫答案時使用它)。這將有助於避免_situations_,例如:「您的代碼不適合我」或「它不適用於我的數據」等。 – MaxU
您不清楚您想要做什麼... – MaxU
我不希望通過數據行的行進行簡單的循環。否則,我可以輕鬆地在numpy中實現它。我需要循環通過olumn'D'的獨特值,這將產生原始數據幀的子集。有了numpy,我應該迭代2d數組的所有元素,並在'D'列中存儲具有相同值的行。沒有真正的數據需要處理,這就是爲什麼我給了數據框的隨機值。 – ilias