我想对一个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
使用诸如turnout
,mean
...的另一个聚合函数,则可以使用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…