在 Python 中搜索 DataFrame 的最有效方法

Most efficient way to search over a DataFrame in Python

我有一个包含这些数据的 DataFrame :

df = pd.DataFrame({
    'id' : ['a', 'a', 'b', 'b', 'c', 'c'],
    'alias' : ['value'+str(i) for i in range(6)],
    'source' : ['src1', 'src2', 'src1', 'src2', 'src1', 'src3']
})

print(df)

输出:

  id   alias source
0  a  value0   src1
1  a  value1   src2
2  b  value2   src1
3  b  value3   src2
4  c  value4   src1
5  c  value5   src3

我想更改数据框的结构以获得如下内容:

     src1    src2    src3
a  value0  value1    None
b  value2  value3    None
c  value4    None  value5

所以为了处理这个任务,我做了这个函数:

def process_aliases(df):
    sources = set(df['source'])
    indexes = list(set(df['id']))

    cols = {source:[] for source in sources}

    for index in indexes:
        subdf = df[df['id']==index]
        for source in sources:
            alias = subdf[df['source'] == source]['alias']
            cols[source].append(alias.iloc[0].strip() if len(alias) == 1 else None)

    return pd.DataFrame(cols, index=indexes)

我的问题是我的数据框包含超过 1 000 000 行。所以这个函数需要太多时间来处理。使用 Google Colab 的执行时间超过 1 小时。

我不知道我的功能是否是执行此操作的最佳方式。所以,我寻求帮助。

完成此任务的最佳方法是什么? 或者,通过 DataFrame 搜索元素的最快方法是什么?

我相信你想要pivot:

import pandas as pd

df = pd.DataFrame({
    'id' : ['a', 'a', 'b', 'b', 'c', 'c'],
    'alias' : ['value'+str(i) for i in range(6)],
    'source' : ['src1', 'src2', 'src1', 'src2', 'src1', 'src3']
})

print(df.pivot(index='id', columns='source'))
         alias                
source    src1    src2    src3
id                            
a       value0  value1     NaN
b       value2  value3     NaN
c       value4     NaN  value5

如果您出于某种原因严格要求 None 而不是 NaN,您可以这样做:

import numpy as np 

print(df.pivot(index='id', columns='source').replace([np.nan], [None]))
         alias                
source    src1    src2    src3
id                            
a       value0  value1    None
b       value2  value3    None
c       value4    None  value5