![](/img/trans.png)
[英]fastest way for searching and updating values for every rows in Pandas dataframe
[英]Pandas Dataframe: fastest way of updating multiple rows based on a list of dictionaries
根據字典(消息)列表,在 pandas DataFrame 的多行中替換值的最快方法是什么。 最終,我想以每秒約 1000 條消息的峰值速率處理實時流數據(來自 websocket 連接)。 下面我發布一個簡化的人工示例來說明該任務。 目前性能還不夠快。
import random
names = ["Jim", "Bryan", "Roy", "Axel", "Billy", "Charlie", "Peter", "Marie", "Paul"]
data = {'id': np.arange(10000, 20000, 1).tolist(),
'name': [random.choice(names) for _ in range(10000)],
'age': np.random.randint(18, 67, size=10000),
}
df = pd.DataFrame (data, columns = ['id', 'name', 'age'])
df
像這樣的東西:
id name age
0 10000 Charlie 45
1 10001 Peter 36
2 10002 Billy 34
3 10003 Axel 62
4 10004 Paul 20
... ... ... ...
這是用於更新 DataFrame 的字典示例列表:
message_list = [
{
"id": 10002,
"name": "Peter",
"age": 65,
},
{
"id": 10036,
"name": "John",
"age": 26,
},
{
"id": 10789,
"name": "Lisa",
"age": 41,
},
]
這是我目前更新名稱的方法:
def update_df(df, message):
df.loc[df.id == message["id"], 'name'] = message['name']
%%time
[update_df(df, message) for message in message_list]
CPU times: user 5.79 ms, sys: 494 µs, total: 6.29 ms
Wall time: 5.95 ms
有沒有更快的方法來進行這種 DataFrame 更新? 也許用更矢量化的方法替換列表理解?
您可以在系列(來自字典)上使用.map
並使用現有值fillna
。
In [260]: mapper = {d['id']:d['name'] for d in message_list}
In [261]: df['name'] = df['id'].map(mapper).fillna(df['name'])
In [262]: df
Out[262]:
id name age
0 10000 Charlie 45
1 10001 Peter 36
2 10002 Peter 34
3 10003 Axel 62
4 10004 Paul 20
In [269]: mapper
Out[269]: {10002: 'Peter', 10036: 'John', 10789: 'Lisa'}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.