我有一个df,我按两列分组。我想按顺序计算每个组。下面的代码按顺序计算组中的每一行。这似乎比我想象的要容易,但无法弄清楚。
df = pd.DataFrame({
'Key': ['10003', '10009', '10009', '10009',
'10009', '10034', '10034', '10034'],
'Date1': [20120506, 20120506, 20120506, 20120506,
20120620, 20120206, 20120206, 20120405],
'Date2': [20120528, 20120507, 20120615, 20120629,
20120621, 20120305, 20120506, 20120506]
})
df['Count'] = df.groupby(['Key','Date1']).cumcount() + 1
预期结果:
Date1 Date2 Key Count
0 20120506 20120528 10003 1
1 20120506 20120507 10009 2
2 20120506 20120615 10009 2
3 20120506 20120629 10009 2
4 20120620 20120621 10009 3
5 20120206 20120305 10034 4
6 20120206 20120506 10034 4
7 20120405 20120506 10034 5
答案 0 :(得分:5)
您正在寻找groupby
+ ngroup
:
df['Count'] = df.groupby(['Key','Date1']).ngroup() + 1
df
Date1 Date2 Key Count
0 20120506 20120528 10003 1
1 20120506 20120507 10009 2
2 20120506 20120615 10009 2
3 20120506 20120629 10009 2
4 20120620 20120621 10009 3
5 20120206 20120305 10034 4
6 20120206 20120506 10034 4
7 20120405 20120506 10034 5
ngroup
只是给每个群组一个标签。
答案 1 :(得分:2)
或者category
,pd.factorize
也可以为它工作
(df['Key'].astype(str)+df['Date1'].astype(str)).astype('category').cat.codes.add(1)
Out[60]:
0 1
1 2
2 2
3 2
4 3
5 4
6 4
7 5
dtype: int8
答案 2 :(得分:2)
您可以使用pd.factorize
来填充唯一值,这些值可以是tuples
。
df['Count'] = pd.factorize(list(zip(df.Key, df.Date1)))[0] + 1
df
Date1 Date2 Key Count
0 20120506 20120528 10003 1
1 20120506 20120507 10009 2
2 20120506 20120615 10009 2
3 20120506 20120629 10009 2
4 20120620 20120621 10009 3
5 20120206 20120305 10034 4
6 20120206 20120506 10034 4
7 20120405 20120506 10034 5