2014-05-18 17 views
1

在客户机/服务器应用程序中的数据帧件,数据被从服务器请求和输入答复使用请求ID映射:熊猫数据帧:减少对角线子帧单排或如何填充一块

--> Request data for item i using request_id 1 
--> Request data for item j using request_id 2 
: 
<-- Data element i.p for request_id1 
<-- Data element j.p for request_id2 
<-- Data element i.q for request_id1 
<-- Data element j.q for request_id2 
<-- Data element i.r for request_id1 
<-- Data element j.r for request_id2 

传入块被添加到词典中的列表由以下代码作为模拟:

import pandas 
import random 

md = list() 
md.append({'request_id': 1, 'p': random.random()}) 
md.append({'request_id': 2, 'p': random.random()}) 
md.append({'request_id': 1, 'q': random.random()}) 
md.append({'request_id': 2, 'q': random.random()}) 
md.append({'request_id': 1, 'r': random.random()}) 
md.append({'request_id': 2, 'r': random.random()}) 

df = pandas.DataFrame(md).set_index('request_id') 

print df 

当创建从列表MD一个数据帧中,只有一个c-每行olumn有一个值,其他的都是NaN。上面的代码将产生以下结果:

    p   q   r 
request_id        
1   0.955755  NaN  NaN 
2   0.920858  NaN  NaN 
1    NaN 0.583634  NaN 
2    NaN 0.456644  NaN 
1    NaN  NaN 0.198991 
2    NaN  NaN 0.774762 

[6 rows x 3 columns] 

如何减少使用df每REQUEST_ID只有一行?我真正需要的是以下内容:

    p   q   r 
request_id        
1   0.955755 0.583634 0.198991 
2   0.920858 0.456644 0.774762 

[2 rows x 3 columns] 

块没有按特定顺序进入,并且对于每个请求,收到请求消息的结束。保证每个块只发送一次(如果有的话),因此每行只有一个(或零)数据元素不是NaN。

一个典型的应用是一个选项链的异步数据检索,包含各种数据元素,如Price,IV,Delta,Gamma,Theta,Vega。

回答

1

也许不是使用类型的字典列表,使md类型的字典字典:

import pandas 
import random 
import collections 

md = collections.defaultdict(dict) 
md['p'][1] = random.random() 
md['p'][2] = random.random() 
md['q'][2] = random.random() 
md['q'][1] = random.random() 
md['r'][1] = random.random() 
md['r'][2] = random.random() 

df = pandas.DataFrame(md) 
df.index.name = 'request_id' 

print df 

产生类似

    p   q   r 
request_id        
1   0.127898 0.565351 0.966917 
2   0.983144 0.593652 0.617639 

[2 rows x 3 columns] 

虽然低效创建的大数据帧,只是为了稍后收缩它,如果你必须使用一系列的字典,你可以像这样组合:

import pandas as pd 
import random 

md = list() 
md.append({'request_id': 1, 'p': random.random()}) 
md.append({'request_id': 2, 'p': random.random()}) 
md.append({'request_id': 1, 'q': random.random()}) 
md.append({'request_id': 2, 'q': random.random()}) 
md.append({'request_id': 1, 'r': random.random()}) 
md.append({'request_id': 2, 'r': random.random()}) 
df = pd.DataFrame(md).set_index('request_id') 
df = pd.concat([df[col].dropna() for col in df.columns], axis=1) 
print(df) 

这将从每列中删除NaN,然后​​使用pd.concat将系列列表合并到一个DataFrame中。

+0

你使用'defaultdict(dict)'的提示非常出色,并且完美。我没想过,之前从未使用'defaultdict'子类。感谢您抽出宝贵时间阅读我的代码片段,并指出我朝着正确的方向发展! – user3650713