簡體   English   中英

pandas dataframe 按列分組並在自定義 function 上聚合

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM