如何对行进行分组,在一列中计数,在另一列中求和? - python

我想对一个csv文件的行进行分组,在一个列中计数,在另一列中添加。

例如,使用以下代码,我想对Commune上的行进行分组,以使winner的列具有计数,而使Swing列具有合计

Commune Winner Swing longitude latitude turnout
Paris   PAM    1     12.323    12.093   0.3242
Paris   PJD    0     12.323    12.093   0.1233
Paris   PAM    1     12.323    12.093   0.534
Paris   UDF    1     12.323    12.093   0.65434
Madrid  PAM    0     10.435    -3.093   0.3423
Madrid  PAM    1     10.435    -3.093   0.5234
Madrid  PJD    0     10.435    -3.093   0.235

如何对行进行分组,一列中有一列,另一列中有和?

Commune PAM    PJD    UDF    Swing
Paris   3      1      1      3
Madrid  2      1      0      1

到目前为止,我尝试过尝试:

g = df.groupby('Commune').Winner
pd.concat([g.apply(list), g.count()], axis=1, keys=['members', 'number'])

但它返回:

    members number
Commune     
Paris   [PAM, PJD, PAM, UDF] 4
Madrid  [PAM, PAM, UDF] 3

参考方案

使用crosstab并使用DataFrame.join和聚合sum添加新列:

df = pd.crosstab(df['Commune'], df['Winner']).join(df.groupby('Commune')['Swing'].sum())
print (df)
         PAM  PJD  UDF  Swing
Commune                      
Madrid     2    1    0      1
Paris      2    1    1      3

但是如果需要行数:

df1 = pd.crosstab(df['Commune'], df['Winner'], margins=True, margins_name='Total').iloc[:-1]

要么:

df = pd.crosstab(df['Commune'], df['Winner']).assign(Total= lambda x: x.sum(axis=1))
print (df1)
Winner   PAM  PJD  UDF  Total
Commune                      
Madrid     2    1    0      3
Paris      2    1    1      4

编辑:

如果每个组中的所有值以及first使用诸如turnoutmean ...的另一个聚合函数,则可以使用sum进行聚合。

df1 = (df.groupby('Commune')
         .agg({'Swing':'sum', 'longitude':'first','latitude':'first','turnout':'mean'}))
print (df1)
         Swing  longitude  latitude  turnout
Commune                                     
Madrid       1     10.435    -3.093  0.36690
Paris        3     12.323    12.093  0.40896

df = pd.crosstab(df['Commune'], df['Winner']).join(df1)
print (df)
         PAM  PJD  UDF  Swing  longitude  latitude  turnout
Commune                                                    
Madrid     2    1    0      1     10.435    -3.093  0.36690
Paris      2    1    1      3     12.323    12.093  0.40896

如果想要所有没有mean的列的Swing动态创建字典:

d = dict.fromkeys(df.columns.difference(['Commune','Winner','Swing']), 'mean')
d['Swing'] = 'sum'
print (d)
{'latitude': 'mean', 'longitude': 'mean', 'turnout': 'mean', 'Swing': 'sum'}

df1 = df.groupby('Commune').agg(d)
print (df1)
         latitude  longitude  turnout  Swing
Commune                                     
Madrid     -3.093     10.435  0.36690      1
Paris      12.093     12.323  0.40896      3

df = pd.crosstab(df['Commune'], df['Winner']).join(df1)
print (df)
         PAM  PJD  UDF  latitude  longitude  turnout  Swing
Commune                                                    
Madrid     2    1    0    -3.093     10.435  0.36690      1
Paris      2    1    1    12.093     12.323  0.40896      3

python pandas:按行对条件进行分组 - python

我有一个大的pandas数据框,试图从中形成一些行的对。我的df如下所示:object_id increment location event 0 1 d A 0 2 d B 0 3 z C 0 4 g A 0 5 g B 0 6 i C 1 1 k A 1 2 k B ... ... ... ... 对象ID描述特定的对象。增量是每次发生某事(跟踪订单)时…

Python-Excel导出 - python

我有以下代码:import pandas as pd import requests from bs4 import BeautifulSoup res = requests.get("https://www.bankier.pl/gielda/notowania/akcje") soup = BeautifulSoup(res.cont…

pandas DataFrame:根据另一列中的布尔值计算总和 - python

我对Python相当陌生,我尝试在pandas中模拟以下逻辑我目前正在循环抛出行,并希望对前几行的AMOUNT列中的值求和,但只求和最后一次看到的“ TRUE”值。实际数据似乎效率低下(我的数据框大约有500万行)?想知道用Python处理这种逻辑的有效方法是什么?逻辑:逻辑是,如果FLAG为TRUE,我想对前几行的AMOUNT列中的值求和,但只求和最后一次…

在返回'Response'(Python)中传递多个参数 - python

我在Angular工作,正在使用Http请求和响应。是否可以在“响应”中发送多个参数。角度文件:this.http.get("api/agent/applicationaware").subscribe((data:any)... python文件:def get(request): ... return Response(seriali…

Python exchangelib在子文件夹中读取邮件 - python

我想从Outlook邮箱的子文件夹中读取邮件。Inbox ├──myfolder 我可以使用account.inbox.all()阅读收件箱,但我想阅读myfolder中的邮件我尝试了此页面folder部分中的内容,但无法正确完成https://pypi.python.org/pypi/exchangelib/ 参考方案 您需要首先掌握Folder的myfo…