Python 按总和聚合特定列,按最常用值聚合其他列

Python 按总和聚合特定列,按最常用值聚合其他列,python,python-3.x,pandas,dataframe,pandas-groupby,Python,Python 3.x,Pandas,Dataframe,Pandas Groupby,我有一个数据框,看起来像: road dirn length lane 1 L 0 2 1 L 0.6 2 1 L 1.2 1 1 L 0.8 2 2 R 1.5 3 2 R 0.4 2 2 R 9 3 我需要聚合此数据帧,其中我将按列“

我有一个数据框,看起来像:

road    dirn    length  lane
1        L         0     2
1        L       0.6     2
1        L       1.2     1
1        L       0.8     2
2        R       1.5     3
2        R       0.4     2
2        R         9     3
我需要聚合此数据帧,其中我将按列“road”和“dirn”分组,并对列“length”求和,从列“lanes”中获取最常见的值。生成的数据帧应如下所示:

road    dirn    length  lanes
1        L       2.6     2
1        L      10.9     3
我可以使用groupby、agg和sum轻松完成groupby和sum。我已经看到,最常见的值可以使用value_计数获得,但我不知道如何将sum和value_计数结合起来。实际的数据帧非常大,我可能需要将总和和值计数应用于多个列

谁能帮我理解一下: i) 如何分组并获得“长度”和“车道”的最常见值的总和
ii)如何将其扩展到groupby(多列),求和多列),最常见的值(重命名列)

下面的代码将给出列的和长度,并提供列的模式

df.groupby(['road','dirn']).agg({'length':[np.sum],'lane':[pd.Series.mode]})
df.groupby(['road','dirn']).agg({'length':[np.sum],'lane':[np.max]}
下面的代码将列
长度
相加,并提供列
车道的最大值

df.groupby(['road','dirn']).agg({'length':[np.sum],'lane':[pd.Series.mode]})
df.groupby(['road','dirn']).agg({'length':[np.sum],'lane':[np.max]}
sum
一起使用,对于最常用的值:

类似的想法:


编辑:如果有两个聚合函数的列名称列表,则可以使用由
**
合并的字典:

sumL = ['length', 'accidents']
modeL = ['lane']

func = lambda x: x.value_counts().index[0]

d = {**dict.fromkeys(sumL, 'sum'), **dict.fromkeys(modeL, func)}
print (d)

df1 = df.groupby(['road','dirn'], as_index=False).agg(d)

你不认为你需要iat模式:
df.groupby([“road”,“dirn”),as_index=False)。agg({“length”:“sum”,“lane”:lambda x:x.mode()})似乎有效fine@sammywemmy-ya,
iat
可能是多个最常见的值,然后它返回第一个值。@sammywemmy-如果将第一个
2
更改为
1
,则可能会进行测试,如果没有
iat
,则会因
ValueError:函数未减少
@jezrael而失败,这两种方法都有效!非常感谢你。您还可以告诉我如何传递列列表,而不是sum和mode/value_counts函数的单个列吗?我的数据框有70多列。@jezrael是的,没错。例如,我有以下列来汇总长度、事故、交叉口和模式车道、路肩、道路照明等。我有这些列多年的数据,因此大约有70列。感谢您的回复。解决方案是有效的。不过,我现在可以看到,这将适用于数字数据。不幸的是,我也有一些描述性的字符串数据。在这种情况下,值_计数按预期工作。
sumL = ['length', 'accidents']
modeL = ['lane']

func = lambda x: x.value_counts().index[0]

d = {**dict.fromkeys(sumL, 'sum'), **dict.fromkeys(modeL, func)}
print (d)

df1 = df.groupby(['road','dirn'], as_index=False).agg(d)