【发布时间】:2020-08-24 15:07:48
【问题描述】:
我有一个大(3MM 记录)文件。
该文件包含四列:[id, startdate, enddate, status] 每个id都会有多个状态变化,我的目标是转置这些数据并最终得到一个包含以下列的宽数据框:
[id, status1, status2, status3... statusN]
其中行的值将是 id,以及列上状态的开始日期。
行的一个例子是:
["xyz", '2020-08-24 23:42:54', '(blank)', '2020-08-26 21:23:45'...(startdate value for status N)]
我编写了一个执行以下操作的脚本:遍历第一个数据帧的所有行,并将状态存储在一个集合中,这样就没有重复,我可以获得所有状态的足够列表。
df = pd.read_csv('statusdata.csv')
columns = set()
columns.add('id')
for index, row in df.iterrows():
columns.add(row['status'])
然后我创建一个新的数据框,其中包含“id”列,然后是从 Set 中获取的所有其他状态
columnslist = list(columns)
newdf = pd.DataFrame(columns = columnslist)
newdf = newdf[['id']+[c for c in newdf if c not in ['id']]] #this will make 'id' the first column
然后我遍历原始数据帧的所有列并在新数据帧中创建一条新记录,如果它正在读取的 id 尚未在数据帧中,然后将原始 df 中指示的状态的开始日期记录在其上新df中的匹配列。
for index, row in df.iterrows():
if row['opportunityid'] not in newdf['id']:
newdf.loc[len(newdf), 'id'] = row['opportunityid']
newdf.loc[newdf['id'] == row['opportunityid'], row['status']] = row['startdate']
我担心的是代码的速度。以这种速度,将需要 13 多个小时来遍历原始数据帧的所有行,以将其转置到具有唯一键的新数据帧中。有没有办法让这更有效?有没有办法从我的计算机分配更多内存?或者有没有办法将此代码部署在 aws 或其他云计算软件上以使其运行得更快?我目前在 2020 年 13 英寸 mac book pro 上运行它,内存为 32 GB。
谢谢!
【问题讨论】: