pandas Python中使用zip和lambda的Group by子句

ybzsozfc  于 2023-04-28  发布在  Python
关注(0)|答案(4)|浏览(110)

假设有两行,如名称和标记,如下所示:

Names      Marks
Sriyam     [10]
Epali      [10]
Sriyam     [12,13]
Rajendra   [10]
Shankar    [10]
Epali      [13,14]

如何使用group by,lambda和zip函数编写查询,使新结果看起来像下面这样:在这里,它将在列中添加相应名称的值,并在单个变量中求和,并将唯一名称写入一次,如下所示:

names     marks
Sriyam     [35]
Epali      [37]
Rajendra   [10]
Shankar    [10]
wfsdck30

wfsdck301#

使用itertools.chainsum

from itertools import chain

out = (df.groupby('Names')['Marks']
         .agg(lambda x: sum(chain.from_iterable(x)))
      )

输出:

Names
Epali       37
Rajendra    10
Shankar     10
Sriyam      35
Name: Marks, dtype: int64

或者,如果你真的想要一个列表作为输出:

out = (df.groupby('Names')['Marks']
         .agg(lambda x: [sum(chain.from_iterable(x))])
      )

输出:

Names
Epali       [37]
Rajendra    [10]
Shankar     [10]
Sriyam      [35]
Name: Marks, dtype: object
合并列表(高效!)
from itertools import chain

out = (df.groupby('Names')['Marks']
         .agg(lambda x: list(chain.from_iterable(x)))
      )

输出:

Names
Epali       [10, 13, 14]
Rajendra            [10]
Shankar             [10]
Sriyam      [10, 12, 13]
Name: Marks, dtype: object
不同进路的时序
聚合为和

运行时间越短越好。

  • 注:为了更好地比较,我将所有代码标准化,以输出一系列以“名称”为索引的总和。

正如预期的那样,使用sum合并列表的两个解决方案(@Homayoon和@SomeDude)具有二次复杂度。@Chrise和我的解决方案效率更高,但explodeitertools.chain成本更高。

合并列表
# mozway
(df.groupby('Names')['Marks']
   .agg(lambda x: sum(chain.from_iterable(x)))
)

# Chris
df.explode('Marks').groupby('Names')['Marks'].sum()

9gm1akwq

9gm1akwq2#

试试这个:

import pandas as pd

d = {
    "names": ["sriyam", "epali", "sriyam", "rajendra", "shankar", "epali"],
    "marks": [[10], [10], [12, 13], [10], [10], [13, 14]],
}

df = pd.DataFrame(d)
df = df.groupby(by="names", axis=0).sum()
df["marks"] = df["marks"].apply(lambda s: sum(s))
# or df["marks"] = df["marks"].apply(lambda s: [sum(s)]) if you really want the sum to be in a list itself

我希望你在Pandas中想要这个:D

sigwle7e

sigwle7e3#

您可以:

df.groupby('Names', as_index=False).agg(lambda x: [sum(x.sum())])

输出:

Names Marks
0     Epali  [37]
1  Rajendra  [10]
2   Shankar  [10]
3    Sriyam  [35]
p1tboqfb

p1tboqfb4#

下面是另一种使用explode的方法

df = pd.DataFrame(
    {
        'Names':['Sriyam','Epali','Sriyam','Rajendra','Shankar','Epali'],
        'Marks':[[10],[10],[12,13],[10],[10],[13,14]]
    }
)

df.explode('Marks').groupby('Names', as_index=False).sum()

输出

Names  Marks
0     Epali     37
1  Rajendra     10
2   Shankar     10
3    Sriyam     35

如果您希望它们是合并列表

df.groupby('Names', as_index=False).sum()

输出

Names         Marks
0     Epali  [10, 13, 14]
1  Rajendra          [10]
2   Shankar          [10]
3    Sriyam  [10, 12, 13]

相关问题