#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
этому, не обязательно имеет какое-либо отношение к значению возраста. @JethroCao5. @HenryEcker OP говорит о возрасте, и это то, что вы тоже видите из его выборочных данных.