[英]Apply multiple functions to GroupBy object in a specific order
我有一個 dataframe df
,其中包含日期的列date
。
如果我想計算每個組內日期之間的最大差異,那是否可行(無需重新分組且無需使用.apply
)? 如果我做
df
id | date |
---+-------
1 | 2020-01-20
1 | 2020-01-25
2 | 2020-02-03
2 | 2020-02-04
max_diff_for_each_id = df.groupby("id").diff(1).max()
max_diff_for_each_id
id
--
1 5
這當然是我想要的所有組之間的最大差異
id
--
1 5
2 1
我知道我可以重新分組max_diff_for_each_id
但我認為
max_diff_for_each_id = df.groupby("id").diff(1).groupby("id").max()
並不是真的“漂亮”,並說您有多個功能要應用,由於必須一直重新分組而產生大量開銷
這是可行的(無需重新分組,也無需使用.apply)
我認為一般不會,如果每組只有 2 個值或其他一些數據模式應該有替代方案。
#if always 2 values per id in order
df1 = df.groupby("id")['date'].agg(['min','max'])
max_diff_for_each_id = df1['max'].sub(df1['min']).dt.days
或者:
#if always 2 values per id
df2 = df.groupby("id")['date'].agg(['first','last'])
max_diff_for_each_id = df2['last'].sub(df2['first']).dt.days
將id
轉換為索引的一個想法,但max(level=0)
只是隱藏.groupby(level=0).max()
,所以這應該是技巧解決方案(在我看來)
max_diff_for_each_id = df.set_index('id').groupby("id")['date'].diff().max(level=0).dt.days
可能有多個groupby
,例如:
max_diff_for_each_id = df.groupby("id")['date'].diff(1).groupby(df["id"]).max().dt.days
或創建自定義函數,例如:
max_diff_for_each_id = df.groupby("id")['date'].apply(lambda x: x.diff().max()).dt.days
max_diff_for_each_id = df.groupby("id")['date'].agg(lambda x: x.diff().max()).dt.days
print (max_diff_for_each_id)
id
1 5
2 1
dtype: int64
使用numpy.ptp
一種方法:
df.groupby("id").apply(np.ptp)
Output:
id
1 5 days
2 1 days
dtype: timedelta64[ns]
適用於每組任意數量的值
# print(df)
id date
0 1 2020-01-20
1 1 2020-01-25
2 1 2020-01-21
3 2 2020-02-03
4 2 2020-02-04
5 2 2020-02-06
6 2 2020-02-10
df.groupby("id").apply(np.ptp)
Output:
id
1 5 days
2 7 days
dtype: timedelta64[ns]
IIUC,你可以這樣做:
groups = df.groupby('id')
result = groups['date'].max() - groups['date'].min()
print(result)
Output
id
1 5 days
2 1 days
Name: date, dtype: timedelta64[ns]
替代版本:
frame = df.groupby('id').agg({'date': ['max', 'min']})
result = frame[('date', 'max')] - frame[('date', 'min')]
print(result)
Output
id
1 5 days
2 1 days
dtype: timedelta64[ns]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.