繁体   English   中英

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

[英]Multiple conditions using df(loc) 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

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

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

请参阅Python运算符优先级表

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM