除了计算外,还可以用现有数据框选择性地构建新数据框

时间:2019-01-06 21:49:03

标签: python python-3.x pandas numpy merge

填写下面的Pandas代码以创建一个新的数据框customer_spend,该数据框按此顺序包含以下几列:customer_id,name和total_spend。 total_spend是一个新列,其中包含特定客户下达的所有订单的成本之和。

我正在上与Python Pandas相关的在线课程。如我上面所写,此代码的目标是制作一个名为“ customer_spend”的新数据框,其中包含有customer_id,name和total_spend列。

我遇到的麻烦是,仅使用两个不同的现有数据框的一部分来构建数据框。我尝试合并,但它占用现有数据帧的每一列。此外,我在将列重命名为“ total_spend”时遇到困难。

import pandas as pd
import numpy as np

customers = pd.DataFrame([[100, 'Prometheus Barwis', 'prometheus.barwis@me.com',
    '(533) 072-2779'],[101, 'Alain Hennesey', 'alain.hennesey@facebook.com',
    '(942) 208-8460'],[102, 'Chao Peachy', 'chao.peachy@me.com',
    '(510) 121-0098'],[103, 'Somtochukwu Mouritsen',
    'somtochukwu.mouritsen@me.com','(669) 504-8080'],[104,
    'Elisabeth Berry', 'elisabeth.berry@facebook.com','(802) 973-8267']],
    columns = ['customer_id', 'name', 'email', 'phone'])
orders = pd.DataFrame([[1000, 100, 144.82], [1001, 100, 140.93],
   [1002, 102, 104.26], [1003, 100, 194.6 ], [1004, 100, 307.72],
   [1005, 101,  36.69], [1006, 104,  39.59], [1007, 104, 430.94],
   [1008, 103,  31.4 ], [1009, 104, 180.69], [1010, 102, 383.35],
   [1011, 101, 256.2 ], [1012, 103, 930.56], [1013, 100, 423.77],
   [1014, 101, 309.53], [1015, 102, 299.19]],
   columns = ['order_id', 'customer_id', 'order_total'])

combined = pd.merge(customers,orders, on='customer_id')
grouped = combined.groupby('customer_id')['order_total']
grouped.aggregate(np.sum).reset_index()

所需结果:名为“ customer_spend”的数据框,其中包含customer_id,name和total_spend列。 total_spend是一个新列,其中包含order_total的总和。

到目前为止,我所拥有的:只有customer_id和order_total。

我还是这个社区的新手。如果我做不适当的事情,请告诉我。 谢谢。

2 个答案:

答案 0 :(得分:2)

首先考虑将orderscustomer_id进行汇总,然后将生成的customer_id索引的DataFrame合并到customers的所需列上:

cust2spend = orders.groupby('customer_id').sum()[['order_total']].reset_index()
cust2spend
customer_id     order_total
        100         1211.84
        101          602.42
        102          786.80
        103          961.96
        104          651.22

# Before merging, rename the order_total column to total_spend.
# Note that axis=1 could also be axis='columns'.
cust2spend.rename({'order_total': 'total_spend'}, axis=1, inplace=True)

pd.merge(customers[['customer_id', 'name']], cust2spend, on='customer_id')
   customer_id                   name  total_spend
0          100      Prometheus Barwis      1211.84
1          101         Alain Hennesey       602.42
2          102            Chao Peachy       786.80
3          103  Somtochukwu Mouritsen       961.96
4          104        Elisabeth Berry       651.22

答案 1 :(得分:0)

<ul class="sub-menu" style="display: block;">
    <li class="dropdown @CurrentControllerActiveClassName("Option")">
        <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">@Manager.Resource.Value("ABC000") </a>
        <ul class="sub-menu">
            <li>@Html.ActionLink(Manager.Resource.Value("ABC001"), "Import", "Others Country")</li>  
            <li>@Html.ActionLink(Manager.Resource.Value("ABC002"), "Apply", "Accept")</li>
            <li>@Html.ActionLink(Manager.Resource.Value("ABC003"), "Terminate", "Stop Purchasing")</li>
        </ul>
    </li>
</ul>

如果不是必须使用合并,请尝试此操作。