我有一个名为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平台下运行它。
有谁知道如何在最短的时间内完成这项工作?
脚本如下:
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
发布于 2016-11-04 15:18:10
您需要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
计时
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
计时的代码
#[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))
https://stackoverflow.com/questions/40415926
复制相似问题