pandas groupby按总和汇总特定列,按最常见值汇总其他列

时间:2020-07-03 11:32:46

标签: python python-3.x pandas dataframe pandas-groupby

我有一个看起来像这样的数据框:

import re
content = '''
[row1|col1]:{value:{{calculate}}<<report_1>>[Row2|col2];format:float;}
[hiddenr0120a|c0012]:{format:float;}
'''
r = re.compile(r'(\[.+?\]):(\{.*?;\})')
expected = [("[row1|col1]", "{value:{{calculate}}<<report_1>>[Row2|col2];format:float;}",),
            ("[hiddenr0120a|c0012]", "{format:float;}",),]
assert all(t == expected[i][j] for i, x in enumerate(r.findall(content)) for j, t in enumerate(x))

我需要聚合此数据框,在这里我将对“ road”和“ dirn”列进行分组,并对“ length”列求和,并从“ lanes”列中获得最常用的值。结果数据框应如下所示:

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

我可以使用groupby,agg和sum轻松地进行groupby和求和。我已经看到,最常见的值可以使用value_counts获得,但是我不确定如何将sum和value_counts结合使用。实际的数据帧非常大,我可能需要将总和和值计数应用于多个列。

有人可以帮助我了解以下内容: i)如何分组并获得“长度”和“车道”的最常用值 ii)如何将其扩展为groupby(多列),将多列求和,最常见的值(重命名列)

2 个答案:

答案 0 :(得分:1)

GroupBy.agg var payloadData = Data([0x02,0x65,0x6E]) payloadData.append(self.record_to_write.data(using: .utf8)!) let customTextPayload = NFCNDEFPayload.init( format: .nfcWellKnown, type: "T".data(using: .utf8)!, identifier: Data(), payload:payloadData ) self.record_new_arr.append(customTextPayload) let messge = NFCNDEFMessage.init(records: self.record_new_arr ) tag.writeNDEF(messge, completionHandler: { (error: Error?) in if nil != error{ session.alertMessage = "Write NDEF message fail: \(error)" print("Write NDEF message fail: \(error)") }else{ print("Write NDEF message successfull.") session.alertMessage = "Write NDEF message successfull." } }) 一起使用,最常用的值是Series.mode

sum

Series.value_counts类似的想法:

df1 = (df.groupby(['road','dirn'], as_index=False)
         .agg({'length':'sum','lane':lambda x: x.mode().iat[0]}))

df1 = (df.groupby(['road','dirn'], as_index=False)
         .agg({'length':'sum','lane':lambda x: x.value_counts().index[0]}))

编辑:如果同时存在两个聚合函数的列名列表,则可以将GroupBy.agg与由print (df1) road dirn length lane 0 1 L 2.6 2 1 2 R 10.9 3 合并的字典一起使用:

**

答案 1 :(得分:0)

下面的代码将给出列length的总和,并提供列mode的{​​{1}}

lane

下面的代码将对列df.groupby(['road','dirn']).agg({'length':[np.sum],'lane':[pd.Series.mode]}) 求和,并提供列length的最大值

lane