我有以下資料集
df=pd.read_csv('https://raw.githubusercontent.com/michalis0/DataMining_and_MachineLearning/master/data/sales.csv')
df["OrderYear"] = pd.DatetimeIndex(df['Order Date']).year
我想比較一下2017年和2018年的客戶,看看這家店有沒有流失客戶。
我做了兩個對應于 2017 和 2018 的子集:
Customer_2018 = df.loc[(df.OrderYear == 2018)]
Customer_2017 = df.loc[(df.OrderYear == 2017)]
然后我嘗試這樣做來比較兩者:
Churn = Customer_2017['Customer ID'].isin(Customer_2018['Customer ID']).value_counts()
Churn
我得到以下輸出:
True 2206
False 324
Name: Customer ID, dtype: int64
問題是一些客戶可能會在資料集中出現多次,因為他們下了幾個訂單。我只想獲取唯一客戶(這Customer ID是唯一的唯一屬性),然后比較兩個資料框,看看商店在 2017 年到 2018 年之間失去了多少客戶。
uj5u.com熱心網友回復:
要進一步分析,您可以使用pd.crosstab:
out = pd.crosstab(df['Customer ID'], df['OrderYear'])
此時您的資料框如下所示:
>>> out
OrderYear 2015 2016 2017 2018
Customer ID
AA-10315 4 1 4 2
AA-10375 2 4 4 5
AA-10480 1 0 10 1
AA-10645 6 3 8 1
AB-10015 4 0 2 0 # <- lost customer
... ... ... ... ...
XP-21865 10 3 9 6
YC-21895 3 1 3 1
YS-21880 0 5 0 7
ZC-21910 5 9 9 8
ZD-21925 3 0 5 1
值是每個客戶和年份的訂單數。
現在很容易得到“失去的客戶”:
>>> sum((out[2017] != 0) & (out[2018] == 0))
83
uj5u.com熱心網友回復:
如果只需要一個比較,我會使用 python集:
c2017 = set(Customer_2017['Customer ID'])
c2018 = set(Customer_2018['Customer ID'])
print(f'lost customers between 2017 and 2018: {len(c2017 - c2018)}')
print(f'customers from 2017 remaining in 2018: {len(c2017 & c2018)}')
print(f'new customers in 2018: {len(c2018 - c2017)}')
輸出:
lost customers between 2017 and 2018: 83
customers from 2017 remaining in 2018: 552
new customers in 2018: 138
基于crosstab@Corralien的建議:
out = pd.crosstab(df['Customer ID'], df['OrderYear'])
(out.gt(0).astype(int).diff(axis=1)
.replace({0: 'remained', 1: 'new', -1: 'lost'})
.apply(pd.Series.value_counts)
)
輸出:
OrderYear 2015 2016 2017 2018
lost NaN 163 123 83
new NaN 141 191 138
remained NaN 489 479 572
uj5u.com熱心網友回復:
您可以只使用普通集來獲取每年的唯一客戶 ID,然后適當地減去它們:
set_lost_cust = set(Customer_2017["Customer ID"]) - set(Customer_2018["Customer ID"])
len(set_lost_cust)
Out: 83
對于您的原始作業方法,您需要從 DataFrame 中洗掉重復項,以確保每個客戶只出現一次:
Customer_2018 = df.loc[(df.OrderYear == 2018), ?"Customer ID"].drop_duplicates()
Customer_2017 = df.loc[(df.OrderYear == 2017), ?"Customer ID"].drop_duplicates()
Churn = Customer_2017.isin(Customer_2018)
Churn.value_counts()
#Out:
True 552
False 83
Name: Customer ID, dtype: int64
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/353863.html
