簡體   English   中英

計算dask數據幀中所有行差異的有效方法

[英]Efficient way to compute difference of all rows in dask dataframe

我正在尋找有效的方法來計算dask數據幀中所有行的差異(首選)或pandas df中的任何有效方式。我有數百萬行的巨大文件,它就像永遠計算一樣。下面是示例:

d = {'A': [5, 9, 15, 0, 2], 'B': [7, 6, 3, 1, 4], 'C': [8, 11, 2, 5, 3]}
df = pd.DataFrame(data=d, index=['i1', 'i2', 'i3', 'i4', 'i5'])
print(df)
tmp = pd.DataFrame(columns=['A', 'B', 'C'])
row_pointer = 1
for index, row in df.iterrows():
    for i, r in df.iloc[row_pointer:].iterrows():
        tmp.loc['(' + index + ' - ' + i + ')'] = df.loc[index] - df.loc[i]
    row_pointer += 1
print(tmp)

輸出:

 A  B   C
i1   5  7   8
i2   9  6  11
i3  15  3   2
i4   0  1   5
i5   2  4   3
         A   B   C
(i1 - i2)   -4   1  -3
(i1 - i3)  -10   4   6
(i1 - i4)    5   6   3
(i1 - i5)    3   3   5
(i2 - i3)   -6   3   9
(i2 - i4)    9   5   6
(i2 - i5)    7   2   8
(i3 - i4)   15   2  -3
(i3 - i5)   13  -1  -1
(i4 - i5)   -2  -3   2

使用廣播進行所有減法。 然后用<來獲得所有唯一組合的子集。

import pandas as pd
import numpy as np

arr = df.to_numpy()
res = pd.DataFrame(np.vstack(arr[:, None]-arr), 
                   index=pd.MultiIndex.from_product([df.index, df.index]))
res = res[res.index.get_level_values(0) < res.index.get_level_values(1)]

print(res)

        0  1  2
i1 i2  -4  1 -3
   i3 -10  4  6
   i4   5  6  3
   i5   3  3  5
i2 i3  -6  3  9
   i4   9  5  6
   i5   7  2  8
i3 i4  15  2 -3
   i5  13 -1 -1
i4 i5  -2 -3  2

數百萬行可能不可行。 或者刪除循環的一個級別:

from itertools import chain 

arr = df.to_numpy()
data = [(arr[i, None]-arr)[i+1:] for i in range(np.shape(arr)[0])]

idx = pd.MultiIndex.from_product([df.index, df.index])
idx = idx[idx.get_level_values(0) < idx.get_level_values(1)]

res = pd.DataFrame(chain.from_iterable(data), index=idx)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM