我有一个像这样的数据框:
Clinic Number date
0 1 2015-05-05
1 1 2015-05-05
2 1 2016-01-01
3 2 2015-05-05
4 2 2016-05-05
5 3 2017-05-05
6 3 2017-05-05
我想创建一个新列并根据某些条件填写它。因此新数据框应如下所示:
Clinic Number date row_number
0 1 2015-05-05 1
1 1 2015-05-05 1
2 1 2016-01-01 2
3 2 2015-05-05 3
4 2 2016-05-05 4
5 3 2017-05-05 5
6 3 2017-05-05 5
将条目放入新列的规则是什么: 诊所编号和日期相同的地方,他们将得到相同的编号,如果更改,它将增加。
例如,这里1 2015-05-05
有两行,这两行具有相同的Clinic Number and date
,因此它们都得到1
。下一行的Clinic Number = 1,但日期与上一行的日期不同,因此它将得到2
。
其中Clinic Number=2
没有诊所号为2且日期相同的行,所以它得到了3
,下一行是4
...
到目前为止,我已经尝试过类似的操作:
def createnumber(x):
x['row_number'] = i
d['row_number']= pd1.groupby(['Clinic Number','date']).apply(createnumber)
但我不知道如何实现此功能。
如果您能帮助我,我表示感谢:) 我也看过像this这样的链接,但是它们不是动态的(我的意思是,在某些情况下,行号应该增加)
答案 0 :(得分:3)
代替groupby
,您可以执行以下操作,分别命名条件。因此,如果日期改变或诊所编号发生变化,则返回True
,然后获取这些cumsum
值中的True
:
df['row_number'] = (df.date.ne(df.date.shift()) | df['Clinic Number'].ne(df['Clinic Number'].shift())).cumsum()
>>> df
Clinic Number date row_number
0 1 2015-05-05 1
1 1 2015-05-05 1
2 1 2016-01-01 2
3 2 2015-05-05 3
4 2 2016-05-05 4
5 3 2017-05-05 5
您需要确保数据框先按Clinic Number
和Date
排序(如果尚未对df.sort_values(['Clinic Number', 'date'], inplace=True)
进行排序,则可以这样做)