【问题标题】:Aggregating two dataframe in Python with lookup function使用查找函数在 Python 中聚合两个数据框
【发布时间】:2021-06-05 13:40:11
【问题描述】:

(这是我之前question的延续)

我现在有两张桌子: df1(每天显示产品及其分类):

            ABC CDE FGH
4/12/2021   S1  S1  S1
4/13/2021   S1  S1  S3
4/14/2021   S1  S2  S2
4/15/2021   S3  S2  S3

和 df2(显示表格和每天的库存数量)

            ABC CDE FGH
4/12/2021   94  19  101
4/13/2021   93  19  102
4/14/2021   94  18  103
4/15/2021   90  17  110

我正在寻找顶部构建一个 df3 表,将每个分类的数量相加,使其看起来像:

            PS1 PS2 PS3
4/12/2021   214 0   0
4/13/2021   112 0   102
4/14/2021   94  121 0
4/15/2021   0   17  200

我在这里再次执行的简单但效率极低的方法是遍历 df1 列中的每个产品,然后遍历每个日期,然后选择值并对分类表执行相同操作,然后逐行构建 df3。这个过程,如果每天运行,大约需要 30 分钟。

请问有python的方法吗?

这里的一个挑战是,df1 或 df2 中可以有更多列,我们不能在此过程中使用列标签。这是另一个困难。

【问题讨论】:

    标签: python


    【解决方案1】:

    让我们第一次合并 2 个数据框。我已将两个数据框中的日期列重命名为索引。

    merged_df = df1.merge(df2, how='left',on ='index')
    print(merged_df)
    

    输出 -

    index ABC_x CDE_x FGH_x ABC_y CDE_y FGH_y
    0 4/12/2021 S1 S1 S1 94 19 101
    1 4/13/2021 S1 S1 S3 93 19 102
    2 4/14/2021 S1 S2 S2 94 18 103
    3 4/15/2021 S3 S2 S3 90 17 110

    现在,我们有了合并的数据集,我们可以通过 apply 方法逐行进行转换。 我创建了一种转换方法来完成这项任务 -

    
    def transform_values(x):
        # print(x['FGH_x'])
        dict1 = {'S1': 'ABC_y', 'S2':'CDE_y', 'S3': 'FGH_y'}
        if x['ABC_x'] != 'S1':
            # print(x['ABC_x'])
            x[dict1[x['ABC_x']]] = x[dict1[x['ABC_x']]] + x['ABC_y']
            x['ABC_y'] = 0
         
        if x['CDE_x'] != 'S2':
            # print(x['CDE_x'])
            x[dict1[x['CDE_x']]] = x[dict1[x['CDE_x']]] + x['CDE_y']
            x['CDE_y'] = 0
            
        if x['FGH_x'] != 'S3':
            print(x[dict1[x['FGH_x']]])
            x[dict1[x['FGH_x']]] = x[dict1[x['FGH_x']]] + x['FGH_y']
            x['FGH_y'] = 0
        
        return x
            
    final_df =  merged_df.apply(lambda x : transform_values(x), axis=1)
    
    print(final_df)
    

    输出 -

    
           index ABC_x CDE_x FGH_x  ABC_y  CDE_y  FGH_y
    0  4/12/2021    S1    S1    S1    214      0      0
    1  4/13/2021    S1    S1    S3    112      0    102
    2  4/14/2021    S1    S2    S2     94    121      0
    3  4/15/2021    S3    S2    S3      0     17    200
    
    

    删除无用的列以获得所需的输出

    【讨论】:

    • 对不起,我没有指定,我们不能使用列的名称,因为今天我们有三个产品和三个标签,但很可能会增长到更多的产品和更多的标签.很抱歉现在才提到它\
    • 好的。但是如果你想做这样的事情,你需要在某个地方定义映射。您可以扩展 dict1 以定义新列的映射并添加与其相关的 if 块。抱歉,我想不出任何其他方法来解决这个问题
    猜你喜欢
    • 1970-01-01
    • 2020-09-20
    • 2014-01-21
    • 1970-01-01
    • 2017-08-15
    • 2016-11-01
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    相关资源
    最近更新 更多