![](/img/trans.png)
[英]pandas groupby() with custom aggregate function to concatenate columns then rows using pandas
[英]pandas dataframe groupby columns and aggregate on custom function
我正在尝试按某些列对 dataframe 进行分组,然后对于每个组,将其列系列作为列表传递给custom
function 或lambda
并获得单个聚合结果。
这是一个df:
orgid. appid. p. type. version
-------------------------------------------------
24e78b 4ef36d 1 None 3.3.7
24e78b 4ef36d 2 None 3.4.1
24e78b 4ef36d 1 None 3.3.7-beta-1
24e78b 4ef36d 1 None 3.4.0-mvn.1
24e78b 4ef36d 2 None 3.4.0-beta.5
24e78b 4ef36d 1 None 3.4.0-beta.1
24e78b 4ef36d 1 None 3.4.0
24e78b 4ef36d 1 None 3.3.5
所以我有一个 function ,它接受一个版本列表并返回一个max
版本字符串。
>> versions = ['3.4.0-mvn.1', '3.4.0-beta.1', '3.4.0', '3.3.7-beta-1', '3.3.7', '3.3.5', '3.4.0-beta-1']
>> str(max(map(semver.VersionInfo.parse, versions)))
'3.4.0'
现在我想将 dataframe 分组,然后将每个组的version
系列作为列表传递给此 function 并返回单个版本字符串。
我试过了:
>> g = df.groupby(['orgid', 'appid', 'p', 'type'])
>> g['version'].apply(lambda x: str(max(map(semver.VersionInfo.parse, x.tolist()))))
Series([], Name: version, dtype: float64)
我得到一个空系列。
预期 output:
orgid. appid. p. type. version
24e78b 4ef36d 1 None 3.4.0
24e78b 4ef36d 2 None 3.4.1
我还在此处发布的多个列上通过多个自定义聚合 function 引用此 Pandas 组。
但无法正确处理。
尝试:
import semver
df["version"] = df["version"].apply(semver.VersionInfo.parse)
out = df.groupby(["orgid", "appid", "p", "type"], as_index=False).max()
print(out)
印刷:
orgid appid p type version
0 24e78b 4ef36d 1 None 3.4.0
1 24e78b 4ef36d 2 None 3.4.1
这是因为您传递给 groupby 方法的列中的 None 值。
试着做:
df = df.fillna('None')
在调用 df.groupby(...) 之前,它应该可以工作。
out = (df.groupby(['orgid', 'appid', 'p', 'type'], as_index=False)['version']
.agg(lambda x: max(semver.VersionInfo.parse(v) for v in x)))
print(out)
# Output:
orgid appid p type version
0 24e78b 4ef36d 1 None 3.4.0
1 24e78b 4ef36d 2 None 3.4.1
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.