python - 根据条件更改 pandas 中的列值

标签 python pandas

df:

      A
0    219
1    590
2    272
3    945
4    175
5    930
6    662
7    472
8    251
9    130

我正在尝试根据值所在的分位数创建一个新的列分位数,例如:

if value > 1st quantile : value = 1
if value > 2nd quantile : value = 2
if value > 3rd quantile : value = 3
if value > 4th quantile : value = 4

代码:

f_q = df['A'] .quantile (0.25)
s_q = df['A'] .quantile (0.5)
t_q = df['A'] .quantile (0.75)
fo_q = df['A'] .quantile (1)


index = 0
for i  in range(len(test_df)):

   value = df.at[index,"A"]
   if value > 0 and value <= f_q:
       df.at[index,"A"] = 1

   elif value > f_q and value <= s_q:
       df.at[index,"A"] = 2

   elif value > s_q and value <= t_q:
       df.at[index,"A"] = 3

   elif value > t_q and value <= fo_q:
       df.at[index,"A"] = 4


   index += 1

代码运行良好。但我想知道是否有更有效的 pandas 方法来做到这一点。任何建议都会有帮助。

最佳答案

是的,使用 pd.qcut :

>>> pd.qcut(df.A, 4).cat.codes + 1
0    1
1    3
2    2
3    4
4    1
5    4
6    4
7    3
8    2
9    1
dtype: int8

(给我的结果与您的代码完全相同。)

您也可以调用np.unique qcut 结果:

>>> np.unique(pd.qcut(df.A, 4), return_inverse=True)[1] + 1
array([1, 3, 2, 4, 1, 4, 4, 3, 2, 1])

或者,使用 pd.factorize (注意输出中的细微差别):

>>> pd.factorize(pd.qcut(df.A, 4))[0] + 1
array([1, 2, 3, 4, 1, 4, 4, 2, 3, 1])

关于python - 根据条件更改 pandas 中的列值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53235718/

相关文章:

python - 为什么我的 main 方法底部的 print 语句不打印任何内容?

python - pandas 数据框的汇总数据

python - 根据两列的比较从第二个 DataFrame 添加列

python - 如何在数据框列上应用上限?

python - 如何旋转复杂的数据框

python - Django:根据用户显示不同的内容

python - 无法将图像保存到 django 模型

python - 尝试从包含奇怪字符的文件中读取某些文本。 (Python)

python - 获取两个日期 Pandas 之间的周数

python - Pandas 中的数据透视表出现意外输出