我有以下脚本。
我被困在最后一行。因此,如果列recencypct <= 0.25,它将在第一个四分位数中,当它大于0.75时,它将在第4个四分位数中。
我正在尝试添加多个条件来计算第二个和第三个四分位数。
第二个四分位数> 0.25且<= 0.5 第三四分位数是> 0.5和<= 0.75
但是当我尝试在最后一行添加这些多个条件时,出现错误:
TypeError: cannot compare a dtyped [float64] array with a scalar of type [bool]
有人有什么想法吗?
import pandas as pd
path = 'Desktop/customer_features.csv'
df = pd.read_csv(path, delimiter=',', header='infer')
#Calculate the percentile for recency, frequency and monetary
df['recencypct'] = df.recency.rank(pct=True)
df['freqencypct'] = df.frequency.rank(pct=True)
df['monencypct'] = df.monetary.rank(pct=True)
#bucket into quartiles
df.loc[df.recencypct <= 0.25, 'recencyqtl'] = 1
df.loc[df.recencypct > 0.75, 'recencyqtl'] = 4
df.loc[df.recencypct > 0.25 & df.recencypct <=0.5, 'recencyqtl'] = 4
答案 0 :(得分:4)
您对函数的求值顺序有疑问,因为&
先于>
和<=
。试试
df.loc[(df.recencypct > 0.25) & (df.recencypct <=0.5), 'recencyqtl'] = 4
答案 1 :(得分:0)
可以使用pd.qcut
方法轻松完成此任务:
df['recencyqtl'] = (pd.qcut(df.loc['recency'], 4, labels=['Q1', 'Q2', 'Q3', 'Q4']))
标签当然可以替换为您想要的任何东西,比如说您的问题中的整数:
df['recencyqtl'] = (pd.qcut(df.loc['recency'], 4, labels=[1, 2, 3, 4]))
您也可以将其设置为索引,以便能够直接访问四分位数中的值:
df_quart = df.set_index(pd.qcut(df.loc['recency'], 4, labels=[1, 2, 3, 4]))
# print values of the second quartile Q2:
print(df_quart.loc[(2, ), :])
或按四分位和具有多索引的索引对数据进行聚类:
df_quart = df.set_index([pd.qcut(df.loc['recency'], 4, labels=[1, 2, 3, 4]), df.index])
现在,您可以访问四分位数,并且仍将数据的原始索引作为第二级索引。