部分数据处理的写法

作者20251个月前 (03-08)python24

记录处理dataFrame格式的一些记录:

# 透视表
rfm = df.pivot_table(index="user_id", 
                     values=["order_products", "order_amount", "order_date],
                     aggfunc={
                         "order_date":"max",
                         "order_products":"sum",
                         "order_amount":"sum"
                         })
# 最后购买日 - 日期中的最大值,再转为天数, 保留1位小数
rfm["R"] = -(rfm['order_date'] - rfm['order_date'].max()) / np.timedelta64(1, 'D')
rfm.rename(columns = {'order_products':'F', 'order_amount':'M'}, inplace=True)
#二值化, 分层
def rfm_func(x): # x代表每一列的数据
    level = x.apply(lambda x: '1' if x>=1 else '0')
    label = level['R'] + level['F'] + level['M'] # 100, 001
    d = {
        '111':'重要价值客户',
        '011':'重要保持客户',
        '101':'重要发展客户',
        '001':'重要挽留客户',
        '110':'一般价值客户',
        '010':'一般保持客户',
        '100':'一般发展客户',
        '000':'一般挽留客户',
        }
        result = d[label]
        return result

# rfm['R'] -rfm['R'].mean()    
rfm['label'] = rfm[['R', 'F', 'M']].apply(lambda x:x-x.mean()).apply(rfm_func, axis=1)
# 可视化
for label, grouped in rfm.groupb(by='label'):
    x = grouped['F']
    y = grouped['R']
    plt.scatter(x, y, label= label)
plt.legend()
plt.xlabel('F')
plt.ylabel('F')

# apply: 作用于dataframe数据中的一行或者一列数据

# applymap: 作用于dataframe数据中的每一个元素

# map: 本身是一个series的函数, 在df结构中无法使用, 而作用于series中每一个元素