以最快的方式从数据框 Python 中的索引创建一个新的字典列表

Posted

技术标签:

【中文标题】以最快的方式从数据框 Python 中的索引创建一个新的字典列表【英文标题】:Create a new list of dictionary from the index in dataframe Python with the fastest way 【发布时间】:2021-04-29 22:14:27 【问题描述】:

我在字典 index_data 中有约 2 亿条数据:

index_data = [
    3396623046050748: [0, 1],
     3749192045350356: [2],
     4605074846433127: [3],
     112884719857303: [4],
     507466746864539: [5],
     .....
    
]

Key 是 CustId 中的一个值,Value 是 df_data 中 CustID 的索引:

我有一个 DataFrame df_data:

CustID               Score     Number1     Number2     Phone
3396623046050748     2           2           3         0000
3396623046050748     6           2           3        0000
3749192045350356     1           56          23        2222
4605074846433127     67          532         321       3333
112884719857303      3           11          66        4444
507466746864539      7           22          96        5555

注意:如果CustID 重复,则只有Score 列的每行数据不同

我想创建一个新的dict列表(Total_Score是每个CustID的平均ScoreNumberNumber2除以Number1):

result = [
     'CustID'     :3396623046050748,
      'Total_Score': 4,
      'Number'     : 1.5,
      'Phone'      : 0000
     ,
     'CustID'     :3749192045350356,
      'Total_Score': 1,
      'Number'     : 0.41,
      'Phone'      : 2222
     ,
     'CustID'     :4605074846433127,
      'Total_Score': 67,
      'Number'     : 0.6,
      'Phone'      : 3333
     ,
     .........
]

我的解决方案是循环我的字典并使用多处理 from multiprocessing import Process, Manager

def calculateTime(ns, value):
    # get data with share of each process
    df_data2 = ns.df_data
    result2 = ns.result

    # Create new DF from index and old DF
    df_sampleresult = df_data2.loc[value].reset_index(drop = True)

    # create sample list to save data need to append in final result
    dict_sample['CustID'] = df_sampleresult['CustID'][0]
    dict_sample['Time_Score'] = df_sampleresult['Score'].mean()

    result2.append(dict_sample)
    ns.result = result2
    ns.df_data = df_data


if __name__ == '__main__':
    result = list()
    manager = Manager()
    ns = manager.Namespace()
    ns.df = df_data
    ns.result = result

    job = [Process(target = calculateTime, args=(ns,value)) for key,value in 
    index_data.items()]
    _ = [p.start() for p in job]
    _ = [p.join() for p in job]

但它不起作用。性能慢,内存高?我的设置多进程是否正确?还有其他方法吗?

【问题讨论】:

什么是“newfunction”和“table”,“CalculateTime”在哪里使用?编辑问题以显示MCVE 抱歉,我马上更新。 【参考方案1】:
In [353]: df
Out[353]: 
             CustID  Score  Number1  Number2  Phone
0  3396623046050748      2        2        3   0000
1  3396623046050748      6        2        3   0000
2  3749192045350356      1       56       23   2222
3  4605074846433127     67      532      321   3333
4   112884719857303      3       11       66   4444
5   507466746864539      7       22       96   5555

    
In [351]: d = df.groupby(['CustID', 'Phone', round(df.Number2.div(df.Number1), 2)])['Score'].mean().reset_index(name='Total_Score').rename(columns='level_2': 'Number').to_dict('records')

In [352]: d
Out[352]: 
['CustID': 112884719857303, 'Phone': 4444, 'Number': 6.0, 'Total_Score': 3,
 'CustID': 507466746864539, 'Phone': 5555, 'Number': 4.36, 'Total_Score': 7,
 'CustID': 3396623046050748, 'Phone': 0000, 'Number': 1.5, 'Total_Score': 4,
 'CustID': 3749192045350356, 'Phone': 2222, 'Number': 0.41, 'Total_Score': 1,
 'CustID': 4605074846433127, 'Phone': 3333, 'Number': 0.6, 'Total_Score': 67]

【讨论】:

以上是关于以最快的方式从数据框 Python 中的索引创建一个新的字典列表的主要内容,如果未能解决你的问题,请参考以下文章

Pandas:通过从列表的字典映射创建一列

如何创建一列数组,其值来自一列并且它们的长度来自pyspark数据帧中的另一列?

如何从 access 中导入的数据创建一组列表?

加载时基于 Combobox 索引的方法

SpatialPolygons - 在 R 中从坐标创建一组多边形

熊猫(python):如何将列添加到数据框以进行索引?