【发布时间】:2018-06-19 13:11:40
【问题描述】:
我需要遍历一组唯一帐户(下面示例代码中的 AccountID)并为每个唯一 AccountID 计算一系列特征(目前仅显示 TargetCol 作为示例)。实际上,我正在将 csv 文件作为 Pandas 数据帧(1M 行)读取,然后转换为 Numpy 记录数组,以便我仍然可以在循环中引用标题名称。我解决这个问题的方法是为每个唯一的 AccountID 创建一个切片,为每个切片计算 TargetCol,然后将这些切片连接在一起。
我下面的代码工作正常,但我很确定它可以以更有效的方式完成(高效是指减少处理时间)。
%%time
import pandas as pd
import numpy as np
from numpy.random import randn
x=300 #make x higher to test more records
df = pd.DataFrame(randn(x,3),columns=['AccountID','Bcol','Ccol'])
for m,row in df.iterrows():
df.loc[m,'AccountID'] = np.random.randint(int(x/10))
df.loc[m,'Bcol'] = np.int(np.random.uniform(low=0.0, high=1000.0, size=None))/10000
df.loc[m,'Ccol'] = np.int(np.random.uniform(low=0.0, high=1000.0, size=None))/10000
df['TargetCol']=np.nan
dfnum = df.to_records(index=False)
dfnum = np.sort(dfnum, order=['AccountID'])
pd.DataFrame(dfnum)
uniquelist = np.unique(dfnum['AccountID'])
for u in range(0,len(uniquelist)):
dfslice = dfnum[dfnum['AccountID'] == uniquelist[u]]
for i in range(0,len(dfslice)):
if (len(dfslice) - i) >= 6:
dfslice['TargetCol'][i] = np.nansum(dfslice['Bcol'][i:i+6]) / dfslice['Ccol'][i]
else:
dfslice['TargetCol'][i] = np.NaN
if u==0:
dfconcat = dfslice
else:
dfconcat = np.concatenate((dfconcat, dfslice),axis=0)
pd.DataFrame(dfconcat)
【问题讨论】:
标签: python-3.x loops numpy