【问题标题】:assigning quantiles within pandas groups在熊猫组中分配分位数
【发布时间】:2017-10-24 07:25:34
【问题描述】:

我正在尝试根据以下数据框中每个 ID 组中的 J1 列添加分位数。

import pandas as pd
try_df = pd.DataFrame({'ID':['1','1','1','1','1','2','2','2','2','2','3','3','3','3','3'], 'J1': range(15)})
print(try_df)    
try_df["quantiles"] = try_df.groupby("ID")["J1"].transform(pd.qcut,4,["Q1","Q2","Q3","Q4"])

   ID  J1
0   1   0
1   1   1
2   1   2
3   1   3
4   1   4
5   2   5
6   2   6
7   2   7
8   2   8
9   2   9
10  3  10
11  3  11
12  3  12
13  3  13
14  3  14

以上代码给出值错误:invalid literal for long() with base 10: 'Q4'

在真实数据中它会抛出这个错误:

ValueError: could not convert string to float: Q2

有什么解决方法的建议吗?

【问题讨论】:

    标签: python pandas group-by pandas-groupby


    【解决方案1】:

    试试groupby + apply

    try_df.groupby("ID")["J1"].apply(lambda x: pd.qcut(x, 4, ["Q1","Q2","Q3","Q4"]))
    
    0     Q1
    1     Q1
    2     Q2
    3     Q3
    4     Q4
    5     Q1
    6     Q1
    7     Q2
    8     Q3
    9     Q4
    10    Q1
    11    Q1
    12    Q2
    13    Q3
    14    Q4
    Name: J1, dtype: category
    Categories (4, object): [Q1 < Q2 < Q3 < Q4]
    

    【讨论】:

    • 感谢您的快速回复,它在给定数据上运行良好,当我对真实数据执行相同操作时,它给出了 ValueError:Bin 边缘必须是唯一的:array([ nan, nan, nan , 南, 南, 南]) 。我在数据中有一个空白值。知道可能是什么原因吗?我也尝试用一些数字替换它。
    • @Apoorv 鉴于此信息,我无法确定您的错误原因,但请查看stackoverflow.com/questions/36880490/…,这可能会有所帮助。
    • 感谢您的链接!我删除了那个空白值,它工作正常。我认为价值在某种程度上是错误的,没有得到处理。
    • @Apoorv 有道理,尽管我一直认为 pandas 应该善于处理丢失的数据而不会出现那样的错误。
    【解决方案2】:

    对我来说,你的代码在 pandas 0.20.3 中运行得非常好:

    try_df["quantiles"] = try_df.groupby("ID")["J1"].transform(pd.qcut,4,["Q1","Q2","Q3","Q4"])
    print (try_df)
       ID  J1 quantiles
    0   1   0        Q1
    1   1   1        Q1
    2   1   2        Q2
    3   1   3        Q3
    4   1   4        Q4
    5   2   5        Q1
    6   2   6        Q1
    7   2   7        Q2
    8   2   8        Q3
    9   2   9        Q4
    10  3  10        Q1
    11  3  11        Q1
    12  3  12        Q2
    13  3  13        Q3
    14  3  14        Q4
    

    另一种解决方案是使用 lambda 定义函数:

    try_df["quantiles"] = (try_df.groupby("ID")["J1"]
                                 .transform(lambda x: pd.qcut(x,4,["Q1","Q2","Q3","Q4"])))
    print (try_df)
       ID  J1 quantiles
    0   1   0        Q1
    1   1   1        Q1
    2   1   2        Q2
    3   1   3        Q3
    4   1   4        Q4
    5   2   5        Q1
    6   2   6        Q1
    7   2   7        Q2
    8   2   8        Q3
    9   2   9        Q4
    10  3  10        Q1
    11  3  11        Q1
    12  3  12        Q2
    13  3  13        Q3
    14  3  14        Q4
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 2014-04-15
      • 1970-01-01
      • 1970-01-01
      • 2019-08-20
      • 2021-01-29
      相关资源
      最近更新 更多