如何根据熊猫中的某些条件创建row_number

时间:2018-07-22 17:59:08

标签: python pandas dataframe group-by

我有一个像这样的数据框:

   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这样的链接,但是它们不是动态的(我的意思是,在某些情况下,行号应该增加)

1 个答案:

答案 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 NumberDate排序(如果尚未对df.sort_values(['Clinic Number', 'date'], inplace=True)进行排序,则可以这样做)