gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 11:39:27 25 4
gpt4 key购买 nike

我想对 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 添加新列并聚合总和:

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总和...:

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

如果想要在没有 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 - 如何对行进行分组,在一列中计数并在另一列中求和?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58520608/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com