簡體   English   中英

按特定順序將多個功能應用於 GroupBy object

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

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