Как назначить другое значение строки для нового столбца - PullRequest
0 голосов
/ 03 января 2019

Я пытаюсь добавить столбец C_End в DataFrame в Pandas, который выглядит примерно так:

df = pd.DataFrame({'ID':[123,123,123,456,456,789],
                   'C_ID':[8,10,35,36,40,7],
                   'C_Type':['New','Renew','Renew','New','Term','New'],
                   'Rank':[1,2,3,1,2,1]})

Новый столбец должен быть следующим C_Type для каждого идентификатора.основанный на 'Rank', в результате чего DataFrame выглядит следующим образом:

    ID  C_ID C_Type Rank  C_End  
0  123     8    New    1  Renew
1  123    10  Renew    2  Renew
2  123    35  Renew    3   None
3  456    36    New    1   Term
4  456    40   Term    2   None
5  789     7    New    1   None

По сути, я хочу найти строку, где ID = ID и Rank = Rank + 1, и назначить C_Type новому столбцу C_End.Я пытался создать функцию и использовать Apply (ниже), но это заняло целую вечность и в итоге дало мне ошибку.Я все еще новичок в Pandas и Python в целом, но я чувствую, что должно быть простое решение, которого я не вижу.

def get_next_c_type(row):
    return df.loc[(df['id'] == row['id']) & (df['rank'] == row['rank'] + 1),'c_type']

df['c_end'] = df.apply(get_next_c_type, axis = 1)  

Ответы [ 2 ]

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

Вот один из способов использования np.where:

dfs = df.shift(-1)
m1 = df.ID == dfs.ID
m2 = df.Rank + 1 == dfs.Rank
df.loc[:, 'C_End'] = np.where(m1 & m2, dfs.C_Type, None)

   ID    C_ID C_Type  Rank C_End
0  123     8    New     1  Renew
1  123    10  Renew     2  Renew
2  123    35  Renew     3   None
3  456    36    New     1   Term
4  456    40   Term     2   None
5  789     7    New     1   None
0 голосов
/ 03 января 2019

Попробуйте:

df['C_End'] = df.sort_values('Rank').groupby('ID')['C_Type'].transform('shift',-1)

Или, как подсказывает @WB:

df['C_End'] = df.sort_values('Rank').groupby('ID')['C_Type'].shift(-1)

Вывод:

    ID  C_ID C_Type  Rank  C_End
0  123     8    New     1  Renew
1  123    10  Renew     2  Renew
2  123    35  Renew     3    NaN
3  456    36    New     1   Term
4  456    40   Term     2    NaN
5  789     7    New     1    NaN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...