Python -Pandas数据框操作

sbtkgmzw  于 2023-02-28  发布在  Python
关注(0)|答案(2)|浏览(125)

我有一个名为product的DataFrame,其中包含订单、产品和每个产品的数量列表。

我需要创建一个新的DataFrame,其中每个产品名称对应一行,另外两列分别对应订购产品的总和(基本上是每个产品quantity列上的总和)和每个产品的总销售额(每个产品total列上的总和)。
我做了这个函数:

products_unique = products['product_id'].unique()

names = [
    products.loc[
        products['product_id'] == elem
    ]['name'].unique()
    for elem in products_unique
]

orders = [
    len(products.loc[
        products['product_id'] == elem
    ])
    for elem in products_unique
]

totals = [
    products.loc[
        products['product_id'] == elem
    ]['total'].sum()
    for elem in products_unique
]

chart_data = pd.DataFrame({
    'Prodotti': products_unique,
    'Nome': names,
    'Ordini': orders,
    'Totale': totals
})

现在,这个函数和我想的一样,但是有一点我不明白。当我运行它的时候,我得到了这个:

如您所见,列names中的值是list类型,为什么会发生这种情况?
此外,有没有更干净的方法来实现我正在建设的东西?
感谢所有愿意帮助我的人!

jdzmm42g

jdzmm42g1#

chart_data = products.groupby('product_id').agg({
    'name': lambda x: ', '.join(x.unique()),
    'total': ['sum', 'count']
})
chart_data.columns = ['Nome', 'Totale', 'Ordini']
chart_data.reset_index(inplace=True)
chart_data.rename(columns={'product_id': 'Prodotti'}, inplace=True)
k10s72fa

k10s72fa2#

使用groupby_agg

out = (df.groupby('name') .agg(Prodotti=('product_id', 'first'),
                               Nome=('name', 'first'),
                               Ordini=('total', 'size'),
                               Totale=('total', 'sum'))
         .reset_index(drop=True))

输出:

>>> out
   Prodotti    Nome  Ordini  Totale
0      7980  Prod A       2      22
1      8603  Prod B       1      14

>>> df
   product_id    name  total
0        7980  Prod A     10
1        7980  Prod A     12
2        8603  Prod B     14

相关问题