Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从具有特定列值的行开始按累计计数分组_Python_Pandas - Fatal编程技术网

Python 从具有特定列值的行开始按累计计数分组

Python 从具有特定列值的行开始按累计计数分组,python,pandas,Python,Pandas,我想根据两列的值创建两个cumcount列 在下面的示例中,我希望一个cumcount在colA至少为100时开始,另一个cumcount在colB至少为10时开始 columns = ['ID', 'colA', 'colB', 'cumcountA', 'cumountB'] data = [['A', 3, 1, '',''], ['A', 20, 4, '',''], ['A', 102, 8, 1, ''], ['A', 117, 10, 2, 1],

我想根据两列的值创建两个cumcount列

在下面的示例中,我希望一个cumcount在colA至少为100时开始,另一个cumcount在colB至少为10时开始

columns = ['ID', 'colA', 'colB', 'cumcountA', 'cumountB']
data = [['A', 3, 1, '',''],
    ['A', 20, 4, '',''],
    ['A', 102, 8, 1, ''],
    ['A', 117, 10, 2, 1],
    ['B', 75, 0, '',''],
    ['B', 170, 12, 1, 1],
    ['B', 200, 13, 2, 2],
    ['B', 300, 20, 3, 3],     
   ]

pd.DataFrame(columns=columns, data=data)

    ID  colA    colB    cumcountA   cumountB
0   A   3   1       
1   A   20  4       
2   A   102 8   1   
3   A   117 10  2   1
4   B   75  0       
5   B   170 12  1   1
6   B   200 13  2   2
7   B   300 20  3   3

如何计算
cumcountA
cumcountB

您可以尝试设置
df.clip
=
您的值(这里是100和10),然后比较groupby
ID
cumsum

col_list = ['colA','colB']
val_list = [100,10]

df[['cumcountA','cumountB']] = (df[col_list].ge(df[col_list].clip(lower=val_list,axis=1))
                                 .groupby(df['ID']).cumsum().replace(0,''))
print(df)
或者直接比较可能更好:

df[['cumcountA','cumountB']] = (df[['colA','colB']].ge([100,10])
                               .groupby(df['ID']).cumsum().replace(0,''))
print(df)


这很好用。你能解释一下为什么这适用于
ge
?@robroc
ge
大于或等于。我们将比较列是否为列表值,然后比较groupby ID列
  ID  colA  colB cumcountA cumountB
0  A     3     1                   
1  A    20     4                   
2  A   102     8         1         
3  A   117    10         2        1
4  B    75     0                   
5  B   170    12         1        1
6  B   200    13         2        2
7  B   300    20         3        3