首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >python -为800万行dataframe逐行填充唯一值所需的最快时间

python -为800万行dataframe逐行填充唯一值所需的最快时间
EN

Stack Overflow用户
提问于 2016-11-04 13:35:40
回答 1查看 295关注 0票数 0

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

report1 (源数据)如下所示:

门票号码: Col0 Col5 Col1 Col1 Col2 Col3 Col4 Col5 Col6 Col7 Col8

100%:100%;11%;3%;11%;21%;30%;32%;32%;3%;3%;11%;4%;11%;6%;80%;1%;11%;50%;50%;0%;0%。

101元人民币、5元人民币、4元人民币、4元人民币、25元人民币、3元人民币、4元人民币、6元人民币、1元人民币、5元人民币和4元人民币。

102元人民币、5元人民币、45元人民币、33元人民币、11元人民币、3元人民币、4元人民币、6元人民币、1元人民币、5元人民币、3元人民币。

…*…*…*…*…*…*…*…*…*…

8000000元人民币、12元人民币、12元人民币、5元人民币、28元人民币、3元人民币、4元人民币、6元人民币、1元人民币、5元人民币、11元人民币。

df (新数据帧)应该是这样的:

门票号码: Col6 Col0、Col1、Col2、Col3、Col4、Col5、Col6、Col7、Col8

100%:100%;11%;3%;11%;21%;30%;32%;32%;3%;3%;11%;4%;11%;6%;80%;1%;11%;50%;50%;0%;0%。

101元人民币*

102元人民币、45元人民币、45元人民币、33元人民币、11元人民币、3元人民币、4元人民币、6元人民币、1元人民币、1元人民币、5元人民币。

…*…*…*…*…*…*…*…*…*…

8000000元人民币、12元人民币、5元人民币、28元人民币、3元人民币、4元人民币、6元人民币、1元人民币、1元人民币、5元人民币、11元人民币

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

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

脚本如下:

代码语言:javascript
运行
复制
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
EN

回答 1

Stack Overflow用户

发布于 2016-11-04 15:18:10

您需要numpy

代码语言:javascript
运行
复制
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

计时

代码语言:javascript
运行
复制
In [117]: %timeit (orig(report1))
1 loop, best of 3: 7.48 s per loop

In [118]: %timeit (jez1(report1))
1 loop, best of 3: 4.82 s per loop

In [119]: %timeit (jez2(report1))
100 loops, best of 3: 9.57 ms per loop

计时的代码

代码语言:javascript
运行
复制
#[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))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40415926

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档