pandas数据帧中的计算列

时间:2014-06-03 10:33:30

标签: python pandas

我使用以下代码创建了一个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,输出floghlogslog所花费的时间。 (通过减去相应的time_as_float2和time_as_float1)
2.对于hlogflog ..中的每一个,首次显示他们看到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的方式是否正确,因为感觉我的要求非常简单,默认情况下它们会得到支持。

1 个答案:

答案 0 :(得分:1)

你是对的,你构建数据框的方式并不是很好。尝试利用熊猫与numpy的强烈互动。

我首先创建数据框(对于所有索引,您应该知道事前将有多少行以获得更好的性能),然后按行填充。我不能改进这部分因为我没有python 3和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
(...)

现在,通过为t0t1设置单独的列,您的第一个问题变得非常简单:

data_frame['time-it-took'] = data_frame['t1'] - data_frame['t0']

第二个也经常在SO处回答:这是一个典型的groupby-apply组合,你可以在文档中找到很多信息:     #set as index:type     data_frame.set_index([' type'],inplace = True)     #by type:group up,并设置为最小值to     data_frame [' first-time'] = 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'。

同样,他们关键是要正确设置数据框,这是你应该花更多时间做的事情。尝试考虑数据在逻辑上的结构方式。