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

标签: pythonpandasdataframe

解决方案


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 值。


推荐阅读