使用df(loc)的多个条件

2024-04-25 21:58:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我有下面的剧本。你知道吗

我被困在最后一条线上了。所以如果列recencypt<;=0.25,它将位于第一个四分位数,当它高于0.75时,它位于第四个四分位数。你知道吗

我试图添加多个条件来计算第二个和第三个四分位数。你知道吗

第二个四分位数为>;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

Tags: csvpathltgttruedf条件loc
2条回答

使用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])

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

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

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

参见Python operator precedence table。你知道吗

相关问题 更多 >