Python Pandas Dataframe:将对角子帧减少为单行或如何逐段填充数据帧

Python Pandas Dataframe:将对角子帧减少为单行或如何逐段填充数据帧,python,pandas,dataframe,flatten,diagonal,Python,Pandas,Dataframe,Flatten,Diagonal,在客户端/服务器应用程序中,从服务器请求数据,并使用请求id映射传入的答复: 从列表md创建数据帧时,每行只有一列具有值,其他所有列均为NaN。上述代码生成以下结果: p q r request_id 1 0.955755 NaN NaN 2 0.920858 NaN NaN 1

在客户端/服务器应用程序中,从服务器请求数据,并使用请求id映射传入的答复:

从列表md创建数据帧时,每行只有一列具有值,其他所有列均为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减少到每个请求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


一个典型的应用是期权链的异步数据检索,其中包含每个期权的各种数据元素,如价格、IV、增量、伽马、θ、织女星

也许不使用dicts列表,而使用
md
一个dicts目录:

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]

尽管创建大型数据帧的效率很低,但为了以后缩小数据帧,如果必须使用DICT列表,可以如下方式组合行:

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将系列列表合并到一个数据帧中。

您使用
defaultdict(dict)
的提示非常出色,效果非常好。我以前从未想过这一点,也从未使用过
defaultdict
子类。感谢您花时间查看我的代码片段并为我指出正确的方向!
                   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)