gpt4 book ai didi

python - Pandas 数据帧 : Reduce Diagonal Sub-Frame to Single Row or How to Fill a Dataframe Piece by Piece

转载 作者:太空宇宙 更新时间:2023-11-03 18:23:09 26 4
gpt4 key购买 nike

在客户端/服务器应用程序中,从服务器请求数据并使用请求 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

传入的 block 被添加到字典列表中,如以下代码模拟的:

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 创建数据框时,每行只有一列有值,其他所有列均为 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]

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

一个典型的应用是对期权链进行异步数据检索,其中每个期权都有各种数据元素,例如 Price、IV、Delta、Gamma、Theta、Vega。

最佳答案

也许不要使用字典列表,而是使 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]
<小时/>

虽然创建一个大的 DataFrame 效率很低,只是为了稍后缩小它,但如果您必须使用字典列表,您可以像这样组合行:

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 将 Series 列表合并到一个 DataFrame 中。

关于python - Pandas 数据帧 : Reduce Diagonal Sub-Frame to Single Row or How to Fill a Dataframe Piece by Piece,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23727954/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com