5 回答

TA貢獻1815條經(jīng)驗 獲得超10個贊
這是另一個解決方案,
import numpy as np
mask = df.groupby('customer_id').transform(np.size).eq(1)
date amount_spent
0 False False
1 False False
2 False False
3 False False
4 True True
5 True True
6 True True
7 True True
8 True True
df[mask['date'] & df.date.eq('2020-01-10')]
date customer_id amount_spent
5 2020-01-10 99 86
6 2020-01-10 67 140
7 2020-01-10 32 321
8 2020-01-10 75 76

TA貢獻1829條經(jīng)驗 獲得超13個贊
如果您正在尋找通用方法,這可能是一個解決方案:
df = pd.DataFrame({
'date':['2020-01-01','2020-01-10','2020-01-01','2020-01-10','2020-01-01','2020-01-10','2020-01-10','2020-01-10','2020-01-10'],
'customer_id':[24,24,58,58,98,99,67,32,75],
'amount_spent':[123,145,89,67,34,86,140,321,76]
})
print(df)
date customer_id amount_spent
0 2020-01-01 24 123
1 2020-01-10 24 145
2 2020-01-01 58 89
3 2020-01-10 58 67
4 2020-01-01 98 34
5 2020-01-10 99 86
6 2020-01-10 67 140
7 2020-01-10 32 321
8 2020-01-10 75 76
您正在查找最后兩個日期,因為您的數(shù)據(jù)集可能看起來不同,而且您不知道要查找的日期。所以現(xiàn)在你應(yīng)該找到最后兩個日期。
df=df.sort_values(by='date')
take_last_dates = df.drop_duplicates(subset='date').sort_values(by='date')
take_last_dates = take_last_dates.date.tolist()
print(take_last_dates)
['2020-01-01', '2020-01-10']
現(xiàn)在您需要為這兩個日期創(chuàng)建兩個 DF,以查看客戶的差異:
df_prev = df[
df.date==take_last_dates[0]
]
print(df_prev)
date customer_id amount_spent
0 2020-01-01 24 123
2 2020-01-01 58 89
4 2020-01-01 98 34
df_current = df[
df.date==take_last_dates[1]
]
print(df_current)
date customer_id amount_spent
1 2020-01-10 24 145
3 2020-01-10 58 67
5 2020-01-10 99 86
6 2020-01-10 67 140
7 2020-01-10 32 321
8 2020-01-10 75 76
所以最后你可以通過使用這兩個 df 得到你的結(jié)果:
new_customers = df_current[
~df_current.customer_id.isin(df_prev.customer_id.tolist())
]
print(new_customers)
date customer_id amount_spent
5 2020-01-10 99 86
6 2020-01-10 67 140
7 2020-01-10 32 321
8 2020-01-10 75 76

TA貢獻1845條經(jīng)驗 獲得超8個贊
假設(shè)您的示例中有錯字(99 是 98)。您可以執(zhí)行以下操作:
df = pd.DataFrame([["2020-01-01",24,123],
["2020-01-10",24,145],
["2020-01-01",58,89],
["2020-01-10",58,67],
["2020-01-01",98,34],
["2020-01-10",98,86],
["2020-01-10",67,140],
["2020-01-10",32,321],
["2020-01-10",75,76]],columns = ["date","customer_id","amount_spent" ])
df["order"] = df.groupby("customer_id").cumcount()
df[(df["date"] == "2020-01-10") & (df["order_x"]==0)]
輸出:
date customer_id amount_spent order_x order_y
6 2020-01-10 67 140 0 0
7 2020-01-10 32 321 0 0
8 2020-01-10 75 76 0 0
這將需要根據(jù)您的 df 的復(fù)雜性進行編輯

TA貢獻1816條經(jīng)驗 獲得超4個贊
這就是你注意到的。不確定您的示例數(shù)據(jù)和輸出是否如您所想。我在 2020-01-10 將客戶 99 更改為 98
創(chuàng)建一個掩碼,它是您所需日期之前/之后的行
選擇切換日期之后(包括切換日期)的行,減去切換日期之前存在的客戶
isin()
import datetime as dt
df = pd.read_csv(io.StringIO("""date customer_id amount_spent
2020-01-01 24 123
2020-01-10 24 145
2020-01-01 58 89
2020-01-10 58 67
2020-01-01 98 34
2020-01-10 98 86
2020-01-10 67 140
2020-01-10 32 321
2020-01-10 75 76"""), sep="\s+")
df["date"] = pd.to_datetime(df["date"])
mask = df["date"] < dt.datetime(2020,1,10)
dfnew = df[~mask & ~df["customer_id"].isin(df.loc[mask,"customer_id"])].groupby("customer_id").sum()
print(dfnew.to_string())
輸出
amount_spent
customer_id
32 321
67 140
75 76

TA貢獻1821條經(jīng)驗 獲得超6個贊
IIUC 你可以customer_id在 中獲取禮物2020-01-01,然后過濾掉它們:
s = df.loc[df["date"]=="2020-01-01", "customer_id"]
print (df[~df["customer_id"].isin(s)])
date customer_id amount_spent
5 2020-01-10 99 86
6 2020-01-10 67 140
7 2020-01-10 32 321
8 2020-01-10 75 76
添加回答
舉報