繁体   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