首页 > 解决方案 > 什么是根据另一列中的值填充列的更有效方法

问题描述

假设我有一个数据框列“代码”,其中包含引用字典中数据的字符串,如下所示:

lst = ['a','b','c']*10000

df = pd.DataFrame({
    'code':lst
})

ref = {
    'a':{
        'LONG':1,
        'LAT':1,
        'COUNTRY':1
    },
    'b':{
        'LONG':2,
        'LAT':2,
        'COUNTRY':2
    },
    'c':{
        'LONG':3,
        'LAT':3,
        'COUNTRY':3
    }
}

我想创建 3 个新的数据框列,“Long”、“Lat”和“Country”,并根据它们在 ref 字典中的代码引用值填充这些列。

我目前的实现如下:

df = df.reindex(columns = df.columns.tolist() + ['Country','Long','Lat'])

start_time = time.time()
for index in df.index:
    df.iloc[index,df.columns.get_loc('Country')]= ref[df.iloc[index,df.columns.get_loc('code')]]['COUNTRY']
    df.iloc[index,df.columns.get_loc('Long')]= ref[df.iloc[index,df.columns.get_loc('code')]]['LONG']
    df.iloc[index,df.columns.get_loc('Lat')]= ref[df.iloc[index,df.columns.get_loc('code')]]['LAT']

print("Time taken to run:  %s seconds" % (time.time() - start_time))

然而,这似乎效率极低,在这个只有 30000 个条目的虚拟数据集上运行大约需要 40 秒。我的实际数据集包含多达 200 万行,甚至没有在一夜之间完成。任何建议将不胜感激,谢谢。

标签: pythonpandasdataframeindexingtime-complexity

解决方案


它可能是这样的

df[['LONG', 'LAT', 'COUNTRY']] = pd.DataFrame(list(df["code"].map(ref)), index=df.index)

推荐阅读