假設我有以下資料框:
import pandas as pd
d = {'id': [1, 2, 3, 3, 3, 2, 2, 1, 2, 3, 2, 3],
'date': [1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4],
'product': ['a', 'a', 'b', 'a', 'b', 'a', 'b', 'c', 'b', 'c', 'c', 'c']}
df = pd.DataFrame(d)
我想在他們購買產品“b”的當天和之后保留每個 ID 的所有資料,并在他們購買產品“b”之前清除所有資料。ID 1 沒有資料,因為他們沒有購買產品,ID 2 有第 3 天和第 4 天的資料,ID 3 有第 1-4 天的資料。
我知道我可以按 id 分組,然后從各個組中過濾行,但我不知道如何根據組使過濾器動態化。我試過回圈遍歷這些組,但速度很慢(現在我有 19,000 個 ID,但它只會隨著我繼續該專案而增長)。
任何幫助將不勝感激。謝謝!
uj5u.com熱心網友回復:
您可以選擇產品“b”,eq并使用groupby 將每組的連續行設定為 True cummax。然后切片資料幀
df[df['product'].eq('b').groupby(df['id']).cummax()]
輸出:
id date product
2 3 1 b
3 3 2 a
4 3 2 b
6 2 3 b
8 2 3 b
9 3 3 c
10 2 4 c
11 3 4 c
注意。這假設資料框是按日期排序的。如果不使用sort_values(by='date')(或by=['group', 'date'])
uj5u.com熱心網友回復:
這是另一個解決方案:groupby 自定義功能
def get_data(x):
idx = np.where(x['product']=='b')[0]
if idx.size:
return x[idx[0]:]
out = df.groupby('id').apply(get_data).droplevel(0).sort_index()
輸出:
id date product
2 3 1 b
3 3 2 a
4 3 2 b
6 2 3 b
8 2 3 b
9 3 3 c
10 2 4 c
11 3 4 c
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/392741.html
