Python 从具有特定列值的行开始按累计计数分组
我想根据两列的值创建两个cumcount列 在下面的示例中,我希望一个cumcount在colA至少为100时开始,另一个cumcount在colB至少为10时开始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],
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),然后比较groupbyID
和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
?@robrocge
大于或等于。我们将比较列是否为列表值,然后比较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