как создать переменную, содержащую возраст другой строки внутри общего идентификатора в Python 3.8?

#python #pandas

Вопрос:

 df = pd.DataFrame({'id': [1,1,2,2,2,3,3,4,4,4,5,5,6,6],
                   'rank' : [1,2,1,2,3,1,2,1,2,3,1,2,1,2],
                   'age' : [20,2,30,28,4,26,3,22,23,1,34,29,56,25],
                   'sex' : ['female','female','male','female','male','female','male','female','male','male','male','female','female','female'],
                   'care' : [np.nan,np.nan,3,np.nan,np.nan,2,np.nan,np.nan,3,np.nan,np.nan,np.nan,2,np.nan]})
 
ID ранг возраст Секс забота новое
1 1 20 Женский NA NA
1 2 2 Женский NA NA
2 1 30 Мужской 3 4
2 2 28 Женский NA NA
2 3 4 Мужской NA NA
3 1 26 Женский 2 3
3 2 3 Мужской NA NA
4 1 22 Женский NA NA
4 2 23 Мужской 3 1
4 3 1 Мужской NA NA
5 1 34 Мужской NA NA
5 2 29 Женский NA NA
6 1 56 Женский 2 25
6 2 25 Женский NA NA

Здравствуйте, люди, приведенная выше таблица содержит следующие переменные:

  • идентификатор : домашний идентификационный номер
  • ранг : рейтинг лица в домохозяйстве, например, 1 означает главу домохозяйства, 2 супруга / супругу 3 детей
  • возраст : возраст человека
  • секс : пол человека
  • уход : содержит рейтинг лица в домохозяйстве, которому предоставляются услуги по уходу.

поэтому я хочу создать переменную под названием new, которая содержит возраст человека, получающего уход в доме. Я пытаюсь сделать это в Python 3.8

Я выполнил это упражнение в Стате с помощью этой команды:

 rangestat new = age, by(id) int(rank care care)
 

а также сделал это в rtudio вот так:

 df <- df %>%                             
  group_by(id) %>%
  mutate(new = age[match(care, rank)]) %>%
  ungroup
 

Надеюсь, я правильно выразился и тоже не причиню неудобств, заранее благодарю вас

Комментарии:

1. Как и вышеприведенный комментатор, я действительно понятия не имею, о чем вы спрашиваете. В чем смысл слова «новый»?

Ответ №1:

Попробуйте этот лайнер:

 result = pd.merge(
    df,
    df[['id', 'rank', 'age']].rename(
        columns={'rank': 'care', 'age': 'new'},
    ),
    how='left',
)
 

Результат — это именно то, что вы хотите:

 >>> result
   id  rank  age     sex  care   new
0   1     1   20  female     2     2
1   1     2    2  female  <NA>  <NA>
2   2     1   30    male     3     4
3   2     2   28  female  <NA>  <NA>
4   2     3    4    male  <NA>  <NA>
5   3     1   26  female     2     3
6   3     2    3    male  <NA>  <NA>
7   4     1   22  female  <NA>  <NA>
8   4     2   23    male     3     1
9   4     3    1    male  <NA>  <NA>
 

Комментарии:

1. Я отредактировал пост с некоторыми примерами, чтобы лучше понять, что я хочу делать на python, спасибо за ваш интерес помочь мне

2. @DarwinGalvis что не так с ответом, который я уже дал? Это работает, не так ли?

3. Я работаю с гораздо большим массивом данных из 148 000 наблюдений, я собираюсь проверить ответ, чтобы увидеть, работает ли он

4. Это не сработало с самым длинным фреймом данных, с которым я работаю, в любом случае, спасибо, чувак

5. @DarwinGalvis Вы не даете мне никаких подробностей о том, как моя функция выходит из строя. Я могу помочь вам только в том случае, если вы предоставите мне некоторые подробности о неудаче

Ответ №2:

Ты хочешь чего-то подобного?

 new = pd.Series([2,np.nan,4,np.nan,np.nan,3,np.nan,np.nan,1,np.nan], name="new")
new_df = pd.concat([df, new], axis=1)
print(new_df)

"""
   id  rank  age     sex  care  new
0   1     1   20  female   2.0  2.0
1   1     2    2  female   NaN  NaN
2   2     1   30    male   3.0  4.0
3   2     2   28  female   NaN  NaN
4   2     3    4    male   NaN  NaN
5   3     1   26  female   2.0  3.0
6   3     2    3    male   NaN  NaN
7   4     1   22  female   NaN  NaN
8   4     2   23    male   3.0  1.0
9   4     3    1    male   NaN  NaN
"""

 

Комментарии:

1. Думаю, теперь я понимаю, чего ты хочешь. В new колонке должна быть указана age стоимость человека в том же домашнем хозяйстве id для лица , оказывающего уход, и не указано иное.

2. Я отредактировал свой пост с некоторыми примерами в других программах, чтобы понять, лучше ли понять, что я хочу делать в python

3. Я должен уточнить, что я имел в виду, говоря » new колонка должна иметь age значение самого молодого человека в том же домашнем хозяйстве id «. В любом случае, мне кажется, что решение Риккардо делает то, что вы хотите.

4. Это не младший возраст, это значение ранга, связанное со значением в уходе. id 1 Care 2 соответствует id 1 rank 2 этому, не обязательно имеет какое-либо отношение к значению возраста. @JethroCao

5. @HenryEcker OP говорит о возрасте, и это то, что вы тоже видите из его выборочных данных.