python为800万行datafram按行填充唯一值的最快时间

2024-07-07 08:00:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个名为report1;大小为14列X 800万行的数据帧。我想做的是从第3列到第8列获取每行的唯一值,并将每行的结果填充到名为df的新数据帧中。在

report1(源数据)如下所示:

票号Col0 Col1 Col2 Col3 Col4 Col5 Col6 Col7 Col8

100 21 30 32 3 4 6 1 5 0

101 4 9 25 3 4 6 1 5 4

102 45 33 11 3 4 6 1 5 3

8000000 12 5 28 3 4 6 1 5 11

df(新数据帧)应如下所示:

票号Col0 Col1 Col2 Col3 Col4 Col5 Col6 Col7 Col8

100 21 30 32 3 4 6 1 5 0

101 4 9 25 3 4 6 1 5南

102 45 33 11 3 4 6 1 5南

8000000 12 5 28 3 4 6 1 5 11

到目前为止,我已经能够从下面的简单脚本中得到我想要的东西,但是运行它需要太长时间,即使我尝试过让它在pythonanywhere平台下运行。在

有人知道如何在最短的时间内完成这项工作吗?在

脚本如下:

result = []
for i in range(0,7999999):
    g = pd.unique(report1.iloc[i,7:13].values.ravel())

    arr_list = g.tolist()
    result.append(arr_list)

df = pd.DataFrame(result)
df

Tags: 数据脚本dfresultcol2col3col1票号
1条回答
网友
1楼 · 发布于 2024-07-07 08:00:36

您需要numpy

data = report1.iloc[:,4:10].values
sort_idx = np.argsort(data,axis=1)
row_offset = data.shape[1]*np.arange(data.shape[0])[:,None]
sort_lin_idx = sort_idx[:,1::] + row_offset
dup_lin_idx = sort_lin_idx[np.diff(np.sort(data,axis=1),axis=1)==0]
a = data.ravel().astype(float)
a[dup_lin_idx] = np.nan
data = a.reshape(len(data), -1)
print (pd.DataFrame(data))

     0    1    2    3    4     5
0  3.0  4.0  6.0  1.0  5.0   0.0
1  3.0  4.0  6.0  1.0  5.0   NaN
2  3.0  4.0  6.0  1.0  5.0   NaN
3  3.0  4.0  6.0  1.0  5.0  11.0

计时

^{pr2}$

计时代码

#[40000 rows x 6 columns]
report1 = pd.concat([report1]*10000).reset_index(drop=True)

def orig(df):
    result = []
    for i in range(len(df.index)):
        g = pd.unique(report1.iloc[i,4:10].values.ravel())
        arr_list = g.tolist()
        result.append(arr_list)
    df = pd.DataFrame(result)
    return (df)

def jez1(df):
    df = report1.iloc[:,4:10]
    return (df.where(~df.apply(pd.Series.duplicated, axis=1), np.nan))

def jez2(report1):
    data = report1.iloc[:,4:10].values
    sort_idx = np.argsort(data,axis=1)
    row_offset = data.shape[1]*np.arange(data.shape[0])[:,None]
    sort_lin_idx = sort_idx[:,1::] + row_offset
    dup_lin_idx = sort_lin_idx[np.diff(np.sort(data,axis=1),axis=1)==0]
    a = data.ravel().astype(float)
    a[dup_lin_idx] = np.nan
    data = a.reshape(len(data), -1)
    return (pd.DataFrame(data))

print (orig(report1))    
print (jez1(report1))
print (jez2(report1))

相关问题 更多 >