【问题标题】:how to create variable containing the age of another row inside a common id in Python 3.8?如何在 Python 3.8 中的公共 id 中创建包含另一行年龄的变量?
【发布时间】:2021-11-13 06:28:39
【问题描述】:
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 rank age sex care new
1 1 20 female NA NA
1 2 2 female NA NA
2 1 30 male 3 4
2 2 28 female NA NA
2 3 4 male NA NA
3 1 26 female 2 3
3 2 3 male NA NA
4 1 22 female NA NA
4 2 23 male 3 1
4 3 1 male NA NA
5 1 34 male NA NA
5 2 29 female NA NA
6 1 56 female 2 25
6 2 25 female NA NA

大家好,上表包含以下变量:

  • id : 家庭识别号码
  • rank : 户内人的排名,例如1表示户主,2配偶3子女
  • age : 人的年龄
  • sex : 人的性别
  • care :包含家庭中接受护理服务的人的排名

所以我想创建一个名为 new 的变量,其中包含在家中接受护理的人的年龄。我正在尝试在 Python 3.8 中执行此操作

我用这个命令在 Stata 中做了这个练习:

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

并且在 rtudio 中也这样做:

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

我希望我已经理解了自己,也没有造成不便,我提前谢谢你

【问题讨论】:

  • 就像上面的评论者一样,我真的不知道你在问什么。 “新”是什么意思?

标签: python pandas


【解决方案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>

【讨论】:

  • 我用一些例子编辑了这篇文章,以便更好地理解我想在 python 中做什么,感谢您有兴趣帮助我
  • @DarwinGalvis 我已经提供的答案有什么问题?它有效,不是吗?
  • 我正在使用一个包含 148.000 个观察值的更大数据框,我将测试答案以查看它是否有效
  • 它不适用于我正在使用的最长数据帧,无论如何谢谢老兄
  • @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
"""

【讨论】:

  • 我想我现在得到了你想要的。 new 列是为提供护理的人提供同一家庭中人员idage 值,否则为 N/A。
  • 我用其他程序中的一些示例编辑了我的帖子,看看是否能更好地理解我想在 python 中做什么
  • 我应该澄清一下,我的意思是说“new 列是在同一个家庭id”。无论如何,在我看来,Riccardo 的解决方案可以满足您的需求。
  • 这不是 youngest,而是与护理价值相关联的排名值。 id 1 Care 2 对应 id 1 rank 2 它不一定与年龄值有关。 @JethroCao
  • @HenryEcker OP 说的是年龄,这也是你从他的样本数据中看到的。
猜你喜欢
  • 1970-01-01
  • 2019-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-14
  • 2012-05-11
  • 1970-01-01
  • 2014-07-22
相关资源
最近更新 更多