簡體   English   中英

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM