小编esp*_*ian的帖子

使用Pandas分组进行的累计值计数

我有以下DataFrame:

>>>> df = pd.DataFrame(data={
            'type': ['A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C'],
            'value': [0, 2, 3, 4, 0, 3, 2, 3, 0]})

>>> df
  type  value
0    A      0
1    A      2
2    A      3
3    B      4
4    B      0
5    B      3
6    C      2
7    C      3
8    C      0
Run Code Online (Sandbox Code Playgroud)

我需要完成的工作如下:对于每种类型,请跟踪非零值的累积计数,但是每次遇到0值时都从零开始。

  type  value  cumcount
0    A      0         NaN
1    A      2         1
2    A      3         2
3    B      4         1
4    B      0         NaN …
Run Code Online (Sandbox Code Playgroud)

python pandas pandas-groupby

3
推荐指数
1
解决办法
38
查看次数

使用 PySpark 对数字列进行分箱

我有一个 PySpark DataFrame df,它有一个数字列(带有 NaN)

+-------+
|numbers|
+-------+
| 142.56|
|       |
|2023.33|
| 477.76|
| 175.52|
|1737.45|
| 520.72|
|  641.2|
|   79.3|
| 138.43|
+-------+
Run Code Online (Sandbox Code Playgroud)

我想创建一个新列来定义一些垃圾箱,例如0, (0, 500], (500, 1000], (1000, inf)

有没有办法使用pandas.cut这样的函数来完成此任务?目前,我使用 PySpark 执行此操作的方法是定义一个 udf 函数,如下所示,但这种方法的缺点是繁琐且非参数化

from pyspark.sql import functions as F
from pyspark.sql.types import *

def func(numbers):
    if numbers==0:
        return '0'
    elif numbers>0 and numbers<=500:
        return '(0, 500]'
    elif numbers>500 and numbers<=1000:
        return '(500, 1000]'
    elif numbers>500:
        return '(500, inf)'
    else return …
Run Code Online (Sandbox Code Playgroud)

python pandas apache-spark apache-spark-sql pyspark

3
推荐指数
1
解决办法
4893
查看次数