使用df(loc)熊猫的多种条件

时间:2019-02-01 10:41:01

标签: python pandas

我有以下脚本。

我被困在最后一行。因此,如果列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

2 个答案:

答案 0 :(得分:4)

您对函数的求值顺序有疑问,因为&先于><=。试试

df.loc[(df.recencypct > 0.25) & (df.recencypct <=0.5), 'recencyqtl'] = 4

请参见Python operator precedence table

答案 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])

现在,您可以访问四分位数,并且仍将数据的原始索引作为第二级索引。