Python Pandas Dataframe:将对角子帧减少为单行或如何逐段填充数据帧
在客户端/服务器应用程序中,从服务器请求数据,并使用请求id映射传入的答复: 从列表md创建数据帧时,每行只有一列具有值,其他所有列均为NaN。上述代码生成以下结果: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
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)