Условно увеличить идентификатор строки на основе результатов группового - PullRequest
0 голосов
/ 16 января 2019

Я новичок в питоне У меня есть следующий df

    ClientID    DOB LostDate    Category    ReportedDate
APJ5L9C 1975    3/13/2017   Ungrouped   3/23/2017
APJ5L9C 1993    7/25/2014   Ungrouped   3/5/2017
BKL1N9C 1981    3/22/2017   Ungrouped   3/29/2017
BKL1N9C 1981    1/31/2017   Ungrouped   3/31/2017
BMO3K9C 1982    3/15/2017   Ungrouped   3/27/2017
BOM1N9C 1981    3/16/2017   Ungrouped   3/27/2017
K9E6JSC 2000    3/15/2017   Ungrouped   4/3/2017
K9E6JSC 1994    1/14/2017   Ungrouped   3/24/2017
M12L0A93    1986    3/16/2017   Ungrouped   3/23/2017
M12L0A93    1981    1/17/2017   Ungrouped   3/29/2017
M12L0A94    1981    3/17/2017   Ungrouped   3/29/2017
MCI6A92 1993    3/24/2017   Ungrouped   3/24/2017
N9E4HSC 2000    3/30/2017   Ungrouped   4/3/2017

Следующий код работает хорошо, за исключением того, что я не могу поместить его в цикл, чтобы Cat записывался с инкрементным идентификатором (в основном это конкатенация идентификатора клиента с _1, _2 и т. Д.). желаемый результат состоит в том, что, если первое различие между LostDate и ReporteDate в любой группе записывается как ClientID_1, любое последующее различие между LostDate и ReporteDate в группе уже классифицирует приращения к следующему ID, который не используется. Скажем, если у нас есть ID_2, он идет к ID_3, если ID_5 - последний, он идет к ID_6 и т. Д.

    #Finding the earliest lost date reported in a group
mask = df['Category'] == 'Ungrouped'

df.loc[mask, 'LostDatef'] = df.loc[mask].groupby(['ClientID', 'DOB'])['LostDate'].transform(lambda x:x.min())


df['TimeDiffinDAYS'] = (df['ReportedDate']-df['LostDatef']).dt.days


#Iterate and group INCREMENTALLY DEFINING ClientID
for row in df['TimeDiffinDAYS']:

    if row <=7:
#def assessmentsort(kala):

        df.loc['Category'] = df ['GHJY'].apply(lambda x: '{}'"_1".format(x))

     else:
        df.loc[df.TimeDiffinDAYS > 50, 'Category'] = df ['GHJY'].apply(lambda x: '{}'.format('Ugrouped'))

print df

Мой желаемый результат:

ClientID    DOB LostDate    Category    ReportedDate
APJ5L9C 1975    3/13/2017   APJ5L9C_1   3/23/2017
APJ5L9C 1993    7/25/2014   APJ5L9C_2   3/5/2017
BKL1N9C 1981    3/22/2017   BKL1N9C-1   3/29/2017
BKL1N9C 1981    1/31/2017   BKL1N9C-2   3/31/2017
BMO3K9C 1982    3/15/2017   BMO3K9C_1   3/27/2017
BOM1N9C 1981    3/16/2017   BOM1N9C_1   3/27/2017
K9E6JSC 2000    3/15/2017   K9E6JSC_1   4/3/2017
K9E6JSC 1994    1/14/2017   K9E6JSC_2   3/24/2017
M12L0A93    1986    3/16/2017   M12L0A93_1  3/23/2017
M12L0A93    1981    1/17/2017   M12L0A93_2  3/29/2017
M12L0A94    1981    3/17/2017   M12L0A94_1  3/29/2017
MCI6A92 1993    3/24/2017   MCI6A92_1   3/24/2017
N9E4HSC 2000    3/30/2017   N9E4HSC_1   4/3/2017

Возможно ли это?

1 Ответ

0 голосов
/ 16 января 2019

Вы можете GroupBy ClientID и использовать cumcount, а затем объединить это значение в ClientID, используя str.cat:

g = (df.groupby('ClientID').cumcount() + 1)
df['Category'] = df.ClientID.str.cat('_' + g.astype(str))

   ClientID   DOB   LostDate    Category ReportedDate
0    APJ5L9C  1975  3/13/2017   APJ5L9C_1    3/23/2017
1    APJ5L9C  1993  7/25/2014   APJ5L9C_2     3/5/2017
2    BKL1N9C  1981  3/22/2017   BKL1N9C_1    3/29/2017
3    BKL1N9C  1981  1/31/2017   BKL1N9C_2    3/31/2017
4    BMO3K9C  1982  3/15/2017   BMO3K9C_1    3/27/2017
5    BOM1N9C  1981  3/16/2017   BOM1N9C_1    3/27/2017
6    K9E6JSC  2000  3/15/2017   K9E6JSC_1     4/3/2017
7    K9E6JSC  1994  1/14/2017   K9E6JSC_2    3/24/2017
8   M12L0A93  1986  3/16/2017  M12L0A93_1    3/23/2017
9   M12L0A93  1981  1/17/2017  M12L0A93_2    3/29/2017
10  M12L0A94  1981  3/17/2017  M12L0A94_1    3/29/2017
11   MCI6A92  1993  3/24/2017   MCI6A92_1    3/24/2017
12   N9E4HSC  2000  3/30/2017   N9E4HSC_1     4/3/2017
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...