панды, чтобы найти самое раннее вхождение утверждения и установить для начала - PullRequest
0 голосов
/ 19 ноября 2018

Рассмотрим следующее df

  data = {'Name' : ['John','John','Lucy','Lucy','Lucy'],
            'Payroll' : [15,15,75,75,75],
            'Week' : [1,2,1,2,3]}
    df = pd.DataFrame(data)

Name    Payroll Week
0   John    15  1   
1   John    15  2   
2   Lucy    75  1   
3   Lucy    75  2   
4   Lucy    75  3

То, что я пытаюсь сделать, это правда, применить логическое значение к всему DataFrame, очень похожему на этот, с 2m + строками и 20+ столбцами, чтобы узнать, когда кто-то начал

Чтобы узнать, активен ли кто-то или нет, я передаю условие другому df:

df2 = df.loc[df.Week == df.Week.max()]

Это дает мне последнюю неделю, после чего я использую фильтр isin, чтобы узнать, активен ли человек или ушел

df['Status'] = np.where(df['Payroll'].isin(df2['Payroll']), 'Active','Leaver')

Таким образом, используя приведенный выше код, я получаю следующее, что замечательно, что говорит мне, что, поскольку Джон не на последней неделе, он покинул компанию

Name    Payroll Week    Status
0   John    15  1   Leaver
1   John    15  2   Leaver
2   Lucy    75  1   Active
3   Lucy    75  2   Active
4   Lucy    75  3   Active

То, чего я пытаюсь добиться, это знать, когда Джон начал с нами, я мог бы попробовать маску для каждой недели года и проверить, когда они впервые появились, но я подумал, что должен быть более питонический способ. сделай это!

Желаемый вывод:

 Name   Payroll Week    Status
0   John    15  1   Starter
1   John    15  2   Leaver
2   Lucy    75  1   Starter
3   Lucy    75  2   Active
4   Lucy    75  3   Active

Любая помощь очень ценится.

Редактировать для ясности:

data = {'Name' : ['John','John','John','John','Lucy','Lucy','Lucy','Lucy','Lucy'],
            'Payroll' : [15,15,15,15,75,75,75,75,75],
            'Week' : [1,2,3,4,1,2,3,4,5]}

df = pd.DataFrame(data)

желаемый вывод:

    Name    Payroll Week    Status
0   John    15      1   Starter
1   John    15      2   Active
2   John    15      3   Active
3   John    15      4   Leaver
4   Lucy    75      1   Starter
5   Lucy    75      2   Active
6   Lucy    75      3   Active
7   Lucy    75      4   Active
8   Lucy    75      5   Active

что стоит отметить:

Максимальная неделя 5, поэтому любой, кто не на 5 неделе, является выпускником

первая неделя человека в df делает их стартером.

Все промежуточные недели установлены на Активные.

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

Использование numpy.select с новым условием duplicated:

a = df.loc[df.Week == df.Week.max(), 'Payroll']
m1 = ~df['Payroll'].isin(a)
m2 = ~df['Payroll'].duplicated()
m3 = ~df['Payroll'].duplicated(keep='last')

df['Status'] = np.select([m2, m1 & m3], ['Starter', 'Leaver'], 'Active')
print (df)
   Name  Payroll  Week   Status
0  John       15     1  Starter
1  John       15     2   Active
2  John       15     3   Active
3  John       15     4   Leaver
4  Lucy       75     1  Starter
5  Lucy       75     2   Active
6  Lucy       75     3   Active
7  Lucy       75     4   Active
8  Lucy       75     5   Active
0 голосов
/ 19 ноября 2018

Самый простой способ, с которым я столкнулся, - это использовать groupby и найти минимальный индекс для имени в группе:

for _, dfg in df.groupby(df['Name']):
    gidx = min(dfg.index)
    df.loc[df.index == gidx,'Status'] = 'Starter'

print(df)

И тогда df будет:

   Name  Payroll  Week   Status
0  John       15     1  Starter
1  John       15     2   Leaver
2  Lucy       75     1  Starter
3  Lucy       75     2   Active
4  Lucy       75     3   Active
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...