我使用以下代码创建了一个data_frame:
data_series = {}
while not q.empty():
(name, data_dict) = q.get()
data_series[name] = pd.Series(data_dict)`
data_frame = pd.DataFrame(data_series)
#data_dict is of the format { MD5: [time_as_float1, time_as_float2] }
#I have multiple data_dicts stored in a queue (created by multiple worker threads)
我希望基本上能够实现以下目标:1.对于每个MD5,输出多少时间flog
,hlog
并slog
花费多少时间。(通过减去相应time_as_float2和time_as_float1)
2.对于每个的hlog
,flog
..,展示他们第一次看到了MD5(最小time_as_float1)和他们最后一次看到一个MD5(MAX(time_as_float2)
data_frame: Index: 395 entries, 0037B4F499705D725C2B3B00956B574E to FF11433CC64568110D3AD46037290725 Data columns (total 3 columns): flog 220 non-null values hlog 175 non-null values slog 20 non-null values dtypes: object(3)
(Pdb) data_frame['hlog'] 0037B4F499705D725C2B3B00956B574E [1401808481.57, 1401808481.7] 016E73F1038CE46AF4A619453AC7DE70 [1401808491.38, 1401808491.51] 0250F3B15665E8B00F7D58CCA8C2C8F4 NaN 0260FA375596B150DF8B4D7E3CA2D934 NaN 03173B333E22CE63F6485AC87D616878 [1401808482.36, 1401808482.49]
我什至不确定我构造data_frame的方式是否正确,因为感觉我的要求是如此简单,默认情况下会支持它们。
没错,构建数据框架的方式并不是很好。尝试利用与numpy的强大互动关系。
我首先创建数据框(对于所有索引,您应该事先知道多少行才能获得更好的性能),然后按行填充。由于我没有python 3和python,因此无法改善这一部分queue
。
# first initialize dataframe
data_frame = pd.DataFrame(columns=['type', 'hash', 't0', 't1'], index=np.arange(10))
# this is now what would have to be inside the queue loop
data_dict = {'type': name, 'hash':md5hash,
't0': times[0], 't1': times[1]}
name = "hlog"
data_series = pd.Series(data_dict)
data_frame.loc[0] = data_series
data_series[['t0', 't1']] += 0.5 # now I just quickly "fake" an additional loop to create more data
data_frame.loc[1] = data_series
现在这是我的数据集的样子:
type hash t0 t1
0 hlog MD5 0.1 0.2
1 hlog MD5 0.6 0.7
2 NaN NaN NaN NaN
3 NaN NaN NaN NaN
(...)
因此,现在,对于t0
和分别使用不同的列t1
,您的第一个问题变得非常简单:
data_frame['time-it-took'] = data_frame['t1'] - data_frame['t0']
在SO上也经常回答第二个问题:这是一种典型的groupby-apply组合,您可以在文档中找到很多信息:#设置为索引:type data_frame.set_index(['type'],inplace = True)#按类型:分组,并将最小to
data_frame ['首次'] = data_frame.groupby(level = 0).apply(lambda x:x ['t0']。min())设置为值
现在,这就是我的数据的样子(索引仍设置为哈希类型):
hash t0 t1 time-it-took first-time
type
hlog MD5 0.1 0.2 0.1 0.1
hlog MD5 0.6 0.7 0.1 0.1
NaN NaN NaN NaN NaN NaN
一旦您了解了这里发生的情况,我相信您可以将其应用于找到最大的“ t1”。
同样,他们的关键是正确设置数据帧,这是您应该花费更多时间进行的工作。尝试考虑以最合理的方式构造数据的方式。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句