python - Pandas - 如果在 (col B) 中观察到 (col A) 列中的值,则使用 (col C) 中的值创建一列 (col D)
问题描述
我有一个包含 2524 行的数据框 A,如图所示。在上下文中,这是一项基因组研究,其中状态 1 或 2 分别表示控制或生病。状态值与列 id 相关,例如 sample_1(索引 0)是有病的,样本 5(索引 4)是一个对照。
fid iid father mother sex status
0 fam_7 sample_1 0 0 1 2
1 sample_2 sample_2 0 0 2 2
2 sample_3 sample_3 0 0 1 2
3 sample_4 sample_4 0 0 2 1
4 fam_34 sample_5 0 0 1 1
... ... ... ... ... ... ... 2519 fam_96 sample_2520 0 sample_1132 1 1 2520 fam_97 sample_2521 sample_760 0 1 2 2521 fam_98 sample_2522 sample_1452 0 2 2 2522 fam_99 sample_2523 sample_1793 0 1 2 2523 fam_100 样本_2524 样本_2002 0 1 2
请注意,父列和母列包含值 0。在这种情况下,这意味着它们没有父级,而是父级。
我想创建 2 个新列 ['父亲身份'] 和 ['母亲身份']。我想查找列“父亲”和“母亲”列中的值是否在列 id 中,然后具有状态。可以看到,在索引 2519 处,我们可以读取列 (mother) 中的 sample_1132。我希望添加该母亲的状态 ['母亲状态'] 以确定孩子是否需要父母双方都生病。
为了更好地表示,我只为“孩子”制作了一个单独的数据框:
fid iid father mother sex status
2426 fam_3 sample_2427 sample_1015 sample_1776 1 1
2427 fam_4 sample_2428 sample_1263 sample_1985 2 1
2428 fam_5 sample_2429 sample_517 sample_1508 1 1
2429 fam_6 sample_2430 sample_1753 sample_490 2 1
2430 fam_7 sample_2431 sample_1 sample_312 2 1
2432 fam_9 sample_2433 sample_1845 sample_1627 1 1
2434 fam_11 sample_2435 sample_574 sample_1682 2 1
2435 fam_12 sample_2436 sample_275 sample_947 2 1
2424 fam_1 sample_2425 sample_2397 sample_2351 1 2
2425 fam_2 sample_2426 sample_2063 sample_818 2 2
2431 fam_8 sample_2432 sample_239 sample_1151 2 2
2433 fam_10 sample_2434 sample_171 sample_747 2 2
2440 fam_17 sample_2441 sample_2042 sample_1540 2 2
2441 fam_18 sample_2442 sample_2182 sample_252 2 2
2444 fam_21 sample_2445 sample_1730 sample_1190 2 2
2448 fam_25 sample_2449 sample_1315 sample_762 1 2
我的预期输出将是这样的
fid iid father mother sex status f_st m_st
2434 fam_11 sample_2435 sample_574 sample_1682 2 1 1 2
2435 fam_12 sample_2436 sample_275 sample_947 2 1 1 1
2424 fam_1 sample_2425 sample_2397 sample_2351 1 2 2 2
2425 fam_2 sample_2426 sample_2063 sample_818 2 2 2 1
解决方案
mother status
我建议通过合并获取列:
# Get the "status" column of the mother thanks to her index in the "id" column
df = df.merge(df[["id", "status"]], left_on="mother", right_on="id", how="left", suffixes=('', '_y'))
# Drop the duplicated id column coming from the merge
df.drop("id_y", axis=1, inplace=True)
# Rename the status columns with the desired name
df.rename(columns={"status_y": "mother_status"}, inplace=True)
我让你处理mother_status
列中的 NaN 值。
推荐阅读
- android - 如何从 APK 文件中提取 API 调用?
- r - 使用循环和函数附加到列表时出现“未找到列表”
- r - 使用开始和结束位置的索引在向量的元素之间求和
- dart - Flutter 从不同的 dart 文件访问父 Scaffold
- javascript - Facebook Page Plugin 给出 FBProvider is not defined 错误
- python - 切割表面以使其简单连接/将表面切割成拓扑圆盘?
- ddev - ddev 如何自动创建额外的数据库?
- python - AttributeError:“模型”对象没有属性“名称”
- java - Java:字符串和字符比较
- android - Flutter - 为什么 onVerticalDragEnd 不起作用?